缺少使用Python xml.sax解析XML文件的字符串

时间:2015-02-11 17:11:43

标签: python xml parsing sax

我正在尝试使用Python 2.7解析XML文件

这是我正在使用的XML文件:

<NS:Member>
<NS:Area fid='120410'>
<NS:Code>10021</NS:Code>
<NS:version>4</NS:version>
<NS:versionDate>2004-03-29</NS:versionDate>
<NS:theme>Buildings</NS:theme>
<NS:Value>42.826432</NS:Value>
<NS:changeHistory>
    <NS:changeDate>2002-09-26</NS:changeDate>
    <NS:reasonForChange>New</NS:reasonForChange>
</NS:changeHistory>
<NS:changeHistory>
    <NS:changeDate>2003-10-24</NS:changeDate>
    <NS:reasonForChange>Attributes</NS:reasonForChange>
</NS:changeHistory>
<NS:changeHistory>
    <NS:changeDate>2004-03-18</NS:changeDate>
    <NS:reasonForChange>Attributes</NS:reasonForChange>
</NS:changeHistory>
<NS:Group>Building</NS:Group>
<NS:make>Manmade</NS:make>
<NS:Level>50</NS:Level>
<NS:polygon>
    <NS2:Polygon srsName='NS2:BNG'>
    <NS2:Boundary>
        <NS2:LinearRing>
            <NS2:coordinates>383415.110,400491.900 383411.090,400485.570 383415.500,400482.770 383420.430,400490.530 383418.780,400491.580 383417.930,400490.240 383415.160,400491.980 383415.110,400491.900 
            </NS2:coordinates>
        </NS2:LinearRing>
    </NS2:Boundary>
    </NS2:Polygon>
</NS:polygon></NS:Area>
</NS:Member>

我只对XML文件中的IDGroupmakecoordinates部分感兴趣。

我使用的代码是:

import xml.sax

class MyHandler(xml.sax.ContentHandler):

    def __init__(self):
        self.__CurrentData = ""
        self.__ID = ""
        self.__Group = ""
        self.__make = ""
        self.__coordinates = []
        self.__coordString = ""


    def startElement(self, tag, attributes):
        self.__CurrentData = tag
        if tag == "NS:Area":
            self.__ID = attributes["fid"]
            print "ID: ", self.__ID


    def endElement(self, tag):
        if self.__CurrentData == "NS:Group":
            print "Group: ", self.__Group

        elif self.__CurrentData == "NS:make":
            print "Make: ", self.__make

        elif self.__CurrentData == "NS2:coordinates":
            print "coordinates: ", self.__coordString

        self.__CurrentData = ""


    def characters(self, content):
        if self.__CurrentData == "NS:Area":
            self.__ID = content
        elif self.__CurrentData == "NS:Group":
            self.__Group = content
        elif self.__CurrentData == "NS:make":
            self.__make = content
        elif self.__CurrentData == "NS2:coordinates":
            self.__coordString = content

我希望看到输出如下:

  

ID:120410

     

集团:建设

     

制作:人造

     

坐标:383415.110,400491.900 383411.090,400485.570 383415.500,400482.770 383420.430,400490.530 383418.780,400491.580 383417.930,400490.240 383415.160,400491.980 383415.110,400491.900

但是,我得到的是:

  

ID:120410

     

集团:建设

     

制作:人造

     

坐标:

缺少坐标并被空格日志替换。

我可以知道我的代码有什么问题吗?

非常感谢。

2 个答案:

答案 0 :(得分:0)

您无法使用您的方法正确阅读子代码中的内容,这是找到coordinates内容的位置。我会推荐一个DOM类型的解析器(我个人喜欢 lxml 而不是你正在使用的解析器,因为它会大大简化你的任务,因为它跟踪你的标记元素之间的关系,但我可以详细说明在当前的解析器中必须实现什么来处理它。

为了做到这一点,你需要做的就是编写一个startElement()处理程序,当它看到<parent>标记时会引发一个标记,当你到达结束标记时会endElement()停止标记。然后startElement()处理程序必须在引发标志时看到所有标记。您必须在代码中实现的基本框架看起来像这样。

class SaxwithParentChilds(handler.ContentHandler):

    def __init__(self):
        self.parentflag = False
        self.childlist  = []

    def startElement(self, name, att):
        if name == "parent":
           self.parentflag = True
        elif self.parentflag:
           self.childlist.append(name)

    def endElement(self, name ):
        if name == "parent":
            self.parentflag = False 

答案 1 :(得分:0)

所有

感谢您的帮助。

我只知道发生了什么,这只是因为数据文件的错误对齐。事实证明</NS2:coordinates>应该在坐标末尾旁边,而不是在新行中。

希望这可以帮助其他有同样问题的人。