我正在使用lxml来读取我的xml文件。我正在使用类似下面的代码。它适用于lxml2.3 beta1,但是对于lxml2.3,它给出了zn xml语法错误,如下所示。我查看了两个版本的发行说明,但无法弄清楚可能导致此错误的原因或如何修复它。如果您遇到过这样的事情或有任何线索,请帮忙。
谢谢!
代码:
from lxml import etree
def parseXml(context,attribList,elemList):
for event, element in context:
if element.tag in elemList:
#read element attributes
element.clear()
def main(object):
ns='{NS}'
attribList=['name','age','id']
elemList=[ns+'Employee',ns+'Experience',ns+'Employment',ns+'Project',ns+'Award']
context=etree.iterparse(fullFilePath, events=("start","end"))
parseXml(context,attribList,elemList)
错误:
文件“iterparse.pxi”,第478行,in lxml.etree.iterparse。的下一步 (src / lxml / lxml.etree.c:95348)文件 “iterparse.pxi”,第530行,in lxml.etree.iterparse._read_more_events (src / lxml / lxml.etree.c:95886)文件 “parser.pxi”,第585行,in lxml.etree._raiseParseError (SRC / LXML / lxml.etree.c:71955) XMLSyntaxError:名称空间默认值 未找到前缀,第545行,列 73
xml示例 -
<root xmlns='NS'>
<Employee Name="Mr.ZZ" Age="30">
<Experience TotalYears="10" StartDate="2000-01-01" EndDate="2010-12-12">
<Employment id = "1" EndTime="ABC" StartDate="2000-01-01" EndDate="2002-12-12">
<Project Name="ABC_1" Team="4">
</Project>
</Employment>
<Employment id = "2" EndTime="XYZ" StartDate="2003-01-01" EndDate="2010-12-12">
<PromotionStatus>Manager</PromotionStatus>
<Project Name="XYZ_1" Team="7">
<Award>Star Team Member</Award>
</Project>
</Employment>
</Experience>
</Employee>
</root>
在根目录中重复“员工”。并且在解析器正确地通过了许多员工之后发生了错误。
编辑1: 在捕获异常时,我会发现以下内容:
WARNING:NAMESPACE:NS_ERR_UNDEFINED_NAMESPACE: Namespace default prefix was not found
答案 0 :(得分:2)
好的,所以我终于弄清楚发生了什么。遵循清理已使用元素的良好建议,我正在清理所有元素,包括根节点。根节点是具有默认名称空间前缀的根节点,该前缀适用于该根中的所有节点。由于我清除了根节点,因此默认的名称空间前缀不再是其子元素的nsmap的一部分。以前的版本似乎对此宽容,但最新版本在这个意义上更严格。
不清除根元素,直到我读完xml为我做了诀窍。
答案 1 :(得分:0)
默认命名空间问题。为了像在示例中一样解析流,2.3.0应该可以使用未命名的默认命名空间。
也许您应该发布可能出现此错误的最小xml文件(第545行非常深入到文件中以发生此错误)