【问题标题】:lxml XMLSyntaxError: Namespace default prefix was not foundlxml XMLSyntaxError:未找到命名空间默认前缀
【发布时间】:2011-06-28 18:35:52
【问题描述】:

我正在使用 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 行,在 lxml.etree.iterparse.下一步 (src/lxml/lxml.etree.c:95348) 文件 “iterparse.pxi”,第 530 行,在 lxml.etree.iterparse._read_more_events (src/lxml/lxml.etree.c:95886) 文件 “parser.pxi”,第 585 行,在 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

【问题讨论】:

    标签: python lxml


    【解决方案1】:

    好的,所以我终于弄清楚发生了什么。按照清理使用过的元素的好建议,我正在清理所有元素,包括根节点。根节点是具有默认命名空间前缀的节点,该前缀适用于该根节点内的所有节点。由于我清除了我的根节点,默认命名空间前缀不再是其子元素的 nsmap 的一部分。以前的版本似乎可以原谅这一点,但最新版本在这个意义上更加严格。

    在我读完 xml 之前不清除根元素对我有用。

    【讨论】:

      【解决方案2】:

      当您尝试使用 xpath 表达式时,最常出现默认命名空间问题。为了像您的示例一样解析流,2.3.0 应该可以在未命名的默认命名空间下正常工作。

      也许您应该发布可能出现此错误的最小 xml 文件(第 545 行非常深入到文件中以产生此错误)

      【讨论】:

      • 感谢您的回复菲尔。我在原始帖子中添加了 xml 示例,还编辑了代码示例以显示我如何使用命名空间。我基本上比较元素标签以确保它是我所期望的。如果遇到未知标签,我会记录一个错误。但是在这里,lxml 只是抛出了错误。我检查了第 545 行,看看那里是否有任何问题,但 xml 看起来还不错(应该可以正常使用 lxml 2.3 beta1)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 2013-05-11
      • 1970-01-01
      • 2016-11-25
      • 1970-01-01
      相关资源
      最近更新 更多