【问题标题】:Get only last part of xpath只获取 xpath 的最后一部分
【发布时间】:2015-09-08 13:44:18
【问题描述】:

我在 python 2.7 中使用 lxml 来解析一个 xml 文件。

文件如下所示:

...
<LM>sua</LM>
<LM>citt&agrave;</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 的优雅方式。

【问题讨论】:

  • .getpath 只返回一个字符串,我认为 lxml 没有提供任何更精细的东西。如果您只关心最后一个节点,您可以这样做int(re.search("\[(.*?)]", tree.getelementpath(node.getparent())).groups()[0])(但这不一定“更好”)。

标签: python xml xpath lxml


【解决方案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>&#xA;</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

【讨论】:

  • 我明白了。在这种情况下,我想我会坚持我的次优解决方案。
  • @Angelo,好的,没问题。然后您将不得不手动循环所有节点并计数,因为使用您当前使用的库在 Python 中尚不支持该功能...
猜你喜欢
  • 2011-04-24
  • 2013-06-14
  • 2011-11-15
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-30
相关资源
最近更新 更多