Python:忽略名称空间xml.etree.ElementTree?

2024-09-24 02:18:09 发布

您现在位置:Python中文网/ 问答频道 /正文

如何告诉ElementTree忽略XML文件中的名称空间?在

例如,我更喜欢查询modelVersion(如语句1所示),而不是{http://maven.apache.org/POM/4.0.0}modelVersion(如语句2所示)。在

pom="""
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
</project>
"""

from xml.etree import ElementTree
ElementTree.register_namespace("","http://maven.apache.org/POM/4.0.0")
root = ElementTree.fromstring(pom)

print 1,root.findall('modelVersion')
print 2,root.findall('{http://maven.apache.org/POM/4.0.0}modelVersion')

1 []
2 [<Element '{http://maven.apache.org/POM/4.0.0}modelVersion' at 0x1006bff10>]

Tags: orgprojecthttpapacheroot语句printelementtree
3条回答

似乎没有直接的路径,因此我只简单地将find调用包装起来,例如

from xml.etree import ElementTree as ET

POM = """
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns="http://maven.apache.org/POM/4.0.0">
    <modelVersion>4.0.0</modelVersion>
</project>
"""

NSPS = {'foo' : "http://maven.apache.org/POM/4.0.0"}

# sic!
def findall(node, tag):
    return node.findall('foo:' + tag, NSPS) 

root = ET.fromstring(POM)
print(map(ET.tostring, findall(root, 'modelVersion')))

输出:

^{pr2}$

这是我目前正在做的,这让我非常自信有更好的方法。在

$ cat pom.xml |
   tr '\n' ' ' |
   sed 's/<project [^>]*>/<project>/' |
   myprogram |
   sed 's/<project>/<project xmlns="http:\/\/maven.apache.org\/POM\/4.0.0" xmlns:xsi="http:\/\/www.w3.org\/2001\/XMLSchema-instance" xsi:schemaLocation="http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/maven-v4_0_0.xsd">/'

另一种方法不是忽略,而是删除树中的名称空间,因此没有必要因为它们不存在而“忽略”—请参见nonagon对这个问题的回答(以及我对该问题的扩展,将名称空间包含在属性上):Python ElementTree module: How to ignore the namespace of XML files to locate matching element when using the method "find", "findall"

相关问题 更多 >