我遇到了一个问题。我正在做一些将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。我要缩短名称空间:标记符号
我的问题分为两个部分:
如何获取完全限定的xpath,以使'/ *'是实际的xpath(此外,名称空间是可变的,除非我构建了用于解析它们的实用程序,否则我无法提前声明它们) 。这是我可以通过lxml进行的操作,还是必须使用字符串操作来实现?
如果我想从输出中删除方括号(我只真正在乎xpath的首次出现而不是嵌套),可以使用lxml做到这一点,还是再次只是一个字符串操纵东西?
非常感谢您的帮助!