获取具有缩短名称空间的(完全)合格xpath的列表

时间:2018-12-12 19:47:14

标签: xml python-3.x xpath

我遇到了一个问题。我正在做一些将xml文件的整个xpath结构吐出一个列表的事情,因此最终输出将只是xpath的列表,例如

[/pma:message, /pma:message/body, ...]

当我有一个不包含任何名称空间内容的xml文件时,例如

<body>
    <p>When the new Mexican President Andrés Manuel López Obrador</p>
    <p>INTERIOR VIOLENCE</p>
</body>

我得到正确的输出

/body/p[1]
/body/p[2] 

但是,一旦我有了一些名称空间内容(当然,uris就会映射到文档的顶部),例如。

<pam:article xml:lang="en-US"><prism:publicationName>Time</prism:publicationName>
<body>
    <p>When the new Mexican President Andrés Manuel López Obrador</p>
    <p>INTERIOR VIOLENCE</p>
</body>
</pam:article>

我开始获得如下结果:

/pam:article/*[2]

这显然不理想。我的代码非常简单,如下所示。

def get_xpathlist(file):
    parser = etree.XMLParser(ns_clean=True)
    tree = etree.parse(file, parser)
    return [element.getroottree().getpath(element) for element in tree.iter()]

这似乎是名称空间错误。当我切换

element.getroottree().getpath(element) 

tree.getelementpath(element) 

除{namespace}标签表示法外,我获得了完全合格的xpath。我要缩短名称空间:标记符号

我的问题分为两个部分:

  1. 如何获取完全限定的xpath,以使'/ *'是实际的xpath(此外,名称空间是可变的,除非我构建了用于解析它们的实用程序,否则我无法提前声明它们) 。这是我可以通过lxml进行的操作,还是必须使用字符串操作来实现?

  2. 如果我想从输出中删除方括号(我只真正在乎xpath的首次出现而不是嵌套),可以使用lxml做到这一点,还是再次只是一个字符串操纵东西?

非常感谢您的帮助!

0 个答案:

没有答案