Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python元素树默认名称空间?_Python_Xml_Python 3.x_Namespaces_Elementtree - Fatal编程技术网

Python元素树默认名称空间?

Python元素树默认名称空间?,python,xml,python-3.x,namespaces,elementtree,Python,Xml,Python 3.x,Namespaces,Elementtree,有没有办法在python ElementTree中定义默认/不固定的命名空间?这似乎不起作用 ns = {"":"http://maven.apache.org/POM/4.0.0"} pom = xml.etree.ElementTree.parse("pom.xml") print(pom.findall("version", ns)) 这也不是: ns = {None:"http://maven.apache.org/POM/4.0.0"} pom = xml.etree.Element

有没有办法在python ElementTree中定义默认/不固定的命名空间?这似乎不起作用

ns = {"":"http://maven.apache.org/POM/4.0.0"}
pom = xml.etree.ElementTree.parse("pom.xml")
print(pom.findall("version", ns))
这也不是:

ns = {None:"http://maven.apache.org/POM/4.0.0"}
pom = xml.etree.ElementTree.parse("pom.xml")
print(pom.findall("version", ns))
确实如此,但我必须为每个元素添加前缀:

ns = {"mvn":"http://maven.apache.org/POM/4.0.0"}
pom = xml.etree.ElementTree.parse("pom.xml")
print(pom.findall("mvn:version", ns))
在OSX上使用Python 3.5


编辑:如果答案是“否”,您仍然可以获得赏金:-)。我只想让那些花了很多时间使用它的人给出一个明确的“否”。

没有直接的方法来透明地处理默认名称空间。如前所述,为空名称空间指定非空名称是一种常见的解决方案:

ns = {"mvn":"http://maven.apache.org/POM/4.0.0"}
pom = xml.etree.ElementTree.parse("pom.xml")
print(pom.findall("mvn:version", ns))
请注意,
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"))

您可以使用以下命令检索默认命名空间:

namespace=pom.getroot().tag.split(“}”)[0]+“}”
然后在搜索元素时,将其添加到搜索路径:

打印(pom.findall(名称空间+“版本”))
这不是一个优雅的解决方案,但它可以工作。

Python 3.8中的ElementTree允许使用空字符串作为前缀,因此您可以声明:

ns = {'': 'http://maven.apache.org/POM/4.0.0'}
并将其用作
find*
方法中的第二个参数


来源:

使用
ElementTree
,必须使用前缀。如果使用
lxml
,则可以使用
.nsmap
而不是硬编码前缀。有关处理单引号的详细信息,请参见:
r”“\s(xmlns=“[^”]+”\sxmlns='[^']+')”
修复@juloo65答案:
xmlstring=re.sub(r”“”\s(xmlns=“[^”]+”[^']+'),“”,xmlstring,count=1)
N.B.:“加载XML输入数据时删除默认命名空间定义”不适用于使用
html5lib
将HTML序列化HTML转换为XHTML。