如何使用python获取具有默认名称空间的xml文件中所有元素的xpath?

马里兹

我想获取xml文件中每个元素的xpath。

xml文件:

<root 
xmlns="http://www.w3.org/TR/html4/"
xmlns:h="http://www.w3schools.com/furniture">

<table>
  <tr>
    <h:td>Apples</h:td>
    <h:td>Bananas</h:td>
  </tr>
</table>
</root>

python代码:由于默认名称空间中不允许使用null前缀,因此我使用了自己的前缀。

from lxml import etree 
root=etree.parse(open("MyData.xml",'r'))
ns={'df': 'http://www.w3.org/TR/html4/', 'types': 'http://www.w3schools.com/furniture'}
for e in root.iter():
   b=root.getpath(e)
   print b
   r=root.xpath(b,namespaces=ns)
   #i need both b and r here

xpath像这样(输出b)

/*
/*/*[1]
/*/*[1]/*[1]
/*/*[1]/*[1]/h:td

我无法正确获取具有默认名称空间的元素的xpath,对于那些元素名称,它显示为*。如何正确获取xpath?

基思·霍尔

您可以使用getelementpath,它始终以Clark表示法返回元素,并手动替换名称空间:

x = """
<root 
xmlns="http://www.w3.org/TR/html4/"
xmlns:h="http://www.w3schools.com/furniture">

<table>
  <tr>
    <h:td>Apples</h:td>
    <h:td>Bananas</h:td>
  </tr>
</table>
</root>
"""

from lxml import etree 
root = etree.fromstring(x).getroottree()
ns = {'df': 'http://www.w3.org/TR/html4/', 'types': 'http://www.w3schools.com/furniture'}
for e in root.iter():
    path = root.getelementpath(e)
    root_path = '/' + root.getroot().tag
    if path == '.':
        path = root_path
    else:
        path = root_path + '/' + path
    for ns_key in ns:
        path = path.replace('{' + ns[ns_key] + '}', ns_key + ':')
    print(path)
    r = root.xpath(path, namespaces=ns)
    print(r)

显然,此示例显示了getelementpath返回相对于根节点的路径,例如.和,dt:table而不是/df:rootand /df:root/df:table,因此我们使用tag根元素的手动构建完整路径。

输出:

/df:root
[<Element {http://www.w3.org/TR/html4/}root at 0x37f5348>]
/df:root/df:table
[<Element {http://www.w3.org/TR/html4/}table at 0x44bdb88>]
/df:root/df:table/df:tr
[<Element {http://www.w3.org/TR/html4/}tr at 0x37fa7c8>]
/df:root/df:table/df:tr/types:td[1]
[<Element {http://www.w3schools.com/furniture}td at 0x44bdac8>]
/df:root/df:table/df:tr/types:td[2]
[<Element {http://www.w3schools.com/furniture}td at 0x44bdb88>]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在具有默认名称空间的xml文档上使用XPath

如何使用 R 的 xml2 包获取 XML 文件中所有属性的名称

当xml具有与元素关联的名称空间时,如何使用xslt从xml正确获取数据

使用python从xml中获取所有具有相同名称的元素

java获取XML元素中所有属性的列表或名称

如何使用XPath根据条件获取XML containsg默认名称空间中的特定元素

Python:如何获取当前名称空间中所有对象的大小?

如何使用Kubernetes API获取特定Kubernetes集群中所有名称空间的列表?

如何使用JDOM以相同的名称编写和获取具有相同名称的所有xml元素

具有显式默认名称空间的XML文档的XPath和名称空间规范

使用Javascript获取XML中所有节点的名称

具有默认名称空间的XML :: LibXML

使用属性获取XML树中所有节点的xpath-Python

如何使用google drive api获取google drive中所有文件的名称?

具有默认名称空间且没有preifx的xpath

如何在Python中使用LXML捕获XML文件的所有元素名称?

如何使用xmllint xpath获取具有相同标签名称的所有属性

无论使用C#在XML文件中的级别如何,都获取具有相同标签名称的所有标签

如何在 Python 中找到具有默认命名空间的 XML 子元素?

获取目录node-fs中所有具有信息(名称,类型,大小)的文件

如何使用LINQ to XML连接具有相同名称值的所有子元素

如何总结python中所有文件xml的循环结果

使用Powershell在具有名称空间的XML中选择具有Xpath的属性

如何获取集合中所有文件的所有文件?

如何从名称空间获取所有密钥?

具有名称空间的xpath查询根元素

如何使用JQuery解析具有名称空间的xml(并适用于所有浏览器..)?

使用XmlDocument从具有或不具有名称空间的xml文件读取

如何使用Robot Framework获取网页元素的所有xpath?