我在python 2.7中使用lxml来解析xml文件。
文件如下所示:
...
<LM>sua</LM>
<LM>città</LM>
<LM>e</LM>
<LM>l'</LM>
<LM>alto</LM>
<LM>seggio</LM>:
</l><l>
<LM>oh</LM>
<LM>felice</LM>
<LM>colui</LM>
<LM>cu'</LM>
<LM>ivi</LM>
<LM>elegge</LM>!.
</l><l>
<LM> E</LM>
<LM>io</LM>
<LM>a</LM>
<LM>lui</LM>:
...
我正在遍历树,寻找LM节点。
for node in [z for z in tree.iterfind(".//LM")]:
print tree.getpath(node.getparent())
我得到每个节点的以下输出:
'/TEI.2/text/body/div1/l[480]'
所以,在这种情况下,这意味着当前节点LM在第480个节点L之下。有没有办法得到这个480,请注意以下内容?
In [77]: int(tree.getpath(node.getparent()).split('/')[5][2:].replace(']',''))
Out[77]: 480
我指的是通过xpath的优雅方式。
答案 0 :(得分:1)
所以,在这种情况下,这意味着当前节点LM在第480个节点L之下。有没有办法得到这个480,请注意以下内容?
int(tree.getpath(node.getparent()).split('/')[5][2:].replace(']',''))
如果我理解正确,你只想要相对于其父母的位置?您可以通过执行以下操作让XPath返回最后一个位置:
node.find("position()")
在正常的XPath 1.0中,这意味着“获取当前节点相对于其父节点的位置”。但是,它看起来像XPath support of this Python module is severely limited。支持的表达式只能用于返回节点而不是值。
If you can use XSLT in Python,您可以使用XPath 1.0语法//LM/position()
获取所有职位。为了获得这条路,你还需要做更多的事情:
<xsl:template match="/">
<xsl:apply-templates select="//LM" />
</xsl:template>
<xsl:template match="LM">
<xsl:text>Position: </xsl:text>
<xsl:value-of select="position()" />
<xsl:text>, XPath: </xsl:text>
<xsl:apply-templates select="ancestor::*" mode="path" />
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:template match="*" mode="path">
<xsl:text>/</xsl:text>
<xsl:value-of select="name()" />
</xsl:template>
这将输出一堆行,如:
Position: 4, XPath: /a/b/c
Position: 9, XPath: /a/b/d