背景
在处理一些XML文件时,我们会遇到带有 xmlns
属性的元素,比如 Maven 项目中的 pom.xml
;
这个 xmlns
属性定义了元素的命名空间;
在使用 lxml
解析时,元素和子元素的标签名称不再只是标签名称本身,他们的前面会自动带上xmlns
属性指定的URI
,
这时如果直接使用 xpath
语法定位标签会非常麻烦,经常定位不到对应的元素,所以在此收集 lxml
处理 XML 命名空间的方法;
举例
from lxml import etree
xml_string = """
<project xmlns="http://maven.apache.org/POM/4.0.0">
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
"""
xml_tree = etree.fromstring(xml_string)
# 迭代获取元素标签
for node in xml_tree.iter():
print(node.tag)
运行结果
{http://maven.apache.org/POM/4.0.0}project
{http://maven.apache.org/POM/4.0.0}properties
{http://maven.apache.org/POM/4.0.0}project.build.sourceEncoding
将命名空间拼接到字符串
示例代码
from lxml import etree
xslt_content = """
<project xmlns="http://maven.apache.org/POM/4.0.0">
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
"""
xml_tree = etree.fromstring(xslt_content)
# 读取命名空间 并 放进字符串
ns = "{%s}" % xml_tree.nsmap[None]
# 携带命名空间读取xml节点
# 不能用xpath会出错
for item in xml_tree.findall("{0}properties/{0}project.build.sourceEncoding".format(ns)):
print(item.text)
运行结果
UTF-8
在xpath()方法中携带命名空间
示例代码
from lxml import etree as et
xslt_content = """
<project xmlns="http://maven.apache.org/POM/4.0.0">
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
"""
# 定义命名空间
ns = {"pom": "http://maven.apache.org/POM/4.0.0"}
tree = et.fromstring(xslt_content)
# 携带命名空间解析xml
for node in tree.xpath('//pom:project.build.sourceEncoding', namespaces=ns):
# 打印 元素包含的 文本
print(node.text)
运行结果
UTF-8