如何使用lxml为默认命名空间设置前缀
使用lxml为XML默认命名空间添加前缀
原始XML
<root xmlns="test:env:v.1"><elem1>text-1</elem1><elem2>text-2</elem2></root>
期望输出
<n1:root xmlns:n1="test:env:v.1"><n1:elem1>text-1</n1:elem1><n1:elem2>text-2</n1:elem2></n1:root>
实现代码
from lxml import etree # 原始XML内容 raw_xml = '<root xmlns="test:env:v.1"><elem1>text-1</elem1><elem2>text-2</elem2></root>' # 解析XML文档 root = etree.fromstring(raw_xml) # 获取默认命名空间的URI default_ns_uri = root.nsmap[None] # 指定要使用的前缀 target_prefix = "n1" # 遍历所有元素,为标签添加前缀 for element in root.iter(): # 提取元素的本地名称(去掉命名空间前缀部分) local_name = element.tag.split('}')[-1] # 重新设置标签为带前缀的格式 element.tag = f"{target_prefix}:{local_name}" # 移除根节点上的默认命名空间属性,添加带前缀的命名空间声明 root.attrib.pop('xmlns') root.attrib[f"xmlns:{target_prefix}"] = default_ns_uri # 输出处理后的XML print(etree.tostring(root, encoding='unicode', pretty_print=True))
代码说明
- 通过
root.nsmap[None]直接获取默认命名空间的URI,这是lxml解析后存储默认命名空间的方式 - 遍历所有元素,拆分标签提取本地名称,重新拼接成
前缀:本地名称的格式 - 修改根节点的属性,替换默认命名空间声明为带前缀的形式
- 使用
etree.tostring输出格式化后的XML内容,确保结构符合预期
内容的提问来源于stack exchange,提问作者privod
相关产品推荐
相关产品推荐

