Rob*_*ser 19 python xml namespaces elementtree python-3.x
有没有办法在python ElementTree中定义默认/未固定的命名空间?这似乎不起作用......
ns = {"":"http://maven.apache.org/POM/4.0.0"}
pom = xml.etree.ElementTree.parse("pom.xml")
print(pom.findall("version", ns))
Run Code Online (Sandbox Code Playgroud)
这也不是:
ns = {None:"http://maven.apache.org/POM/4.0.0"}
pom = xml.etree.ElementTree.parse("pom.xml")
print(pom.findall("version", ns))
Run Code Online (Sandbox Code Playgroud)
这样做,但后来我必须为每个元素添加前缀:
ns = {"mvn":"http://maven.apache.org/POM/4.0.0"}
pom = xml.etree.ElementTree.parse("pom.xml")
print(pom.findall("mvn:version", ns))
Run Code Online (Sandbox Code Playgroud)
在OSX上使用Python 3.5.
编辑:如果答案是"不",你仍然可以获得赏金:-).我只想要一个花费大量时间使用它的人明确的"不".
ale*_*cxe 20
没有直接的方法来透明地处理默认命名空间.正如您已经提到的那样,为空名称空间分配非空名称是一种常见的解决方案:
ns = {"mvn":"http://maven.apache.org/POM/4.0.0"}
pom = xml.etree.ElementTree.parse("pom.xml")
print(pom.findall("mvn:version", ns))
Run Code Online (Sandbox Code Playgroud)
请注意,lxml.etree不允许显式使用空名称空间.你会得到:
ValueError:ElementPath中不支持空命名空间前缀
但是,您可以通过在加载XML输入数据时删除默认命名空间定义来简化操作:
import xml.etree.ElementTree as ET
import re
with open("pom.xml") as f:
xmlstring = f.read()
# Remove the default namespace definition (xmlns="http://some/namespace")
xmlstring = re.sub(r'\sxmlns="[^"]+"', '', xmlstring, count=1)
pom = ET.fromstring(xmlstring)
print(pom.findall("version"))
Run Code Online (Sandbox Code Playgroud)
小智 5
Python 3.8 中的 ElementTree 允许空字符串作为前缀,因此您可以声明:
ns = {'': 'http://maven.apache.org/POM/4.0.0'}
Run Code Online (Sandbox Code Playgroud)
并将其用作方法中的第二个参数find*。
来源:https : //docs.python.org/3.8/library/xml.etree.elementtree.html?highlight=xml#xml.etree.ElementTree.Element.find
| 归档时间: |
|
| 查看次数: |
7314 次 |
| 最近记录: |