lxml XMLSyntaxError:找不到命名空间默认前缀

时间:2011-06-28 18:35:53

标签: python lxml

我正在使用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

2 个答案:

答案 0 :(得分:2)

好的,所以我终于弄清楚发生了什么。遵循清理已使用元素的良好建议,我正在清理所有元素,包括根节点。根节点是具有默认名称空间前缀的根节点,该前缀适用于该根中的所有节点。由于我清除了根节点,因此默认的名称空间前缀不再是其子元素的nsmap的一部分。以前的版本似乎对此宽容,但最新版本在这个意义上更严格。

不清除根元素,直到我读完xml为我做了诀窍。

答案 1 :(得分:0)

在尝试xpath表达式时,通常会出现

默认命名空间问题。为了像在示例中一样解析流,2.3.0应该可以使用未命名的默认命名空间。

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