使用lxml为特定行生成XPath

时间:2014-11-14 14:15:56

标签: python xpath lxml

是否可以使用行号和python lxml库生成XPath?

背景:我们在文档中有引用(不是xpath,但是它们的一部分),我希望找到对特定元素的所有引用(在特定行中)

enter code here

<root>
  <element>
    <name>Element1</name>
    <contains>
      <element>
        <name>color</name>
        <value-ref>/Colors/red</value-ref>
      </element>
    </contains>
  </element>
  <element>
    <name>Colors</name>
    <contains>
      <element>
        <name>red</name>
        <value>0xFF0000</value>
      </element>
      <element>
        <name>blue</name>     <!-- the line I'd like to get an Xpath for -->
        <value>0x0000FF</value>
      </element>
    </contains>
  </element>
</root>

在XPath之外,我将在value-ref中创建一个表达式(这可以通过正则表达式完成)

2 个答案:

答案 0 :(得分:1)

我现在用

etree.iter()

迭代所有元素,然后比较

element.sourceline

并将其与我正在寻找的那一行进行比较。现在我有了我正在寻找的元素,并且可以继续生成如上所述的路径。

感谢。

答案 1 :(得分:0)

您可能会执行以下操作来解析文档,创建文档中所有元素的映射及其基础行号(使用lxml Element对象的sourceline属性),然后工作从那里。但如果没有更多关于你想要做的事情的性质的解释,就很难具体化。

编辑:

我仍然不太明白这个问题,但是如果它有用,这里有一些使用lxml的Python代码,并显示示例文档中每个元素的位置路径(xpath)和行号:

import lxml.etree

doc = lxml.etree.parse('test.xml')
tree = lxml.etree.ElementTree(doc.getroot())
for e in tree.xpath('.//*'):
    print(tree.getpath(e), '-', e.sourceline)