2014-06-26 75 views
0

我正在寻找一个Python的XML解析器,包括在每个节点中的某些调试信息,例如行数和列的节点位置开始。理想情况下,这将是一个解析器与xml.etree.ElementTree.XMLParser相容,即,一个我可以传递给xml.etree.ElementTree.parseXML解析器包含调试信息

我知道这些解析器实际上并不产生的元素,所以我不知道如何做到这一点真的管用,但似乎这样的一个有用的东西,我会感到惊讶,如果没有身体有一个。在XML语法错误是一回事,但在最终的结构语义错误可能很难调试,如果你不能指向源文件/串中的某个位置。

回答

1

指向一个元素与XPath(LXML - getpath

lxml报价为寻找文件中的元素的XPath。

有测试文档:

>>> from lxml import etree 
>>> xmlstr = """<root><rec id="01"><subrec>a</subrec><subrec>b</subrec></rec> 
... <rec id="02"><para>graph</para></rec> 
... </root>""" 
... 
>>> doc = etree.fromstring(xmlstr) 
>>> doc 
<Element root at 0x7f61040fd5f0> 

我们挑一个元素<para>graph</para>

>>> para = doc.xpath("//para")[0] 
>>> para 
<Element para at 0x7f61040fd488> 

的XPath都有其意义,如果我们有清晰的脉络,在这种情况下,它是XML文档的根目录:

>>> root = doc.getroottree() 
>>> root 
<lxml.etree._ElementTree at 0x7f610410f758> 

现在我们可以问,什么xpath从根到达我们的元素兴趣:

>>> root.getpath(para) 
'/root/rec[2]/para'