使用 Python xml.sax 解析 XML 文件时缺少字符串
Missing string using Python xml.sax to parse XML file
我正在尝试使用 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 文件中的 ID
、Group
、make
和 coordinates
部分感兴趣。
我使用的代码是:
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
Group: Building
Make: Manmade
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
然而,我得到的是:
ID: 120410
Group: Building
Make: Manmade
coordinates:
缺少坐标并被一串空格替换。
我可以知道我的代码有什么问题吗?
非常感谢。
您无法使用您的方法正确读取子标签中的内容,而您的 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
全部
感谢您的帮助。
我才弄明白是怎么回事,原来是因为数据文件没有对齐。事实证明 </NS2:coordinates>
应该紧挨着坐标的末尾,而不是在新的一行中。
希望这可以帮助其他遇到同样问题的人。
我正在尝试使用 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 文件中的 ID
、Group
、make
和 coordinates
部分感兴趣。
我使用的代码是:
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
Group: Building
Make: Manmade
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
然而,我得到的是:
ID: 120410
Group: Building
Make: Manmade
coordinates:
缺少坐标并被一串空格替换。
我可以知道我的代码有什么问题吗?
非常感谢。
您无法使用您的方法正确读取子标签中的内容,而您的 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
全部
感谢您的帮助。
我才弄明白是怎么回事,原来是因为数据文件没有对齐。事实证明 </NS2:coordinates>
应该紧挨着坐标的末尾,而不是在新的一行中。
希望这可以帮助其他遇到同样问题的人。