如何使用lxml将命名空间包含在xml文件中?

5

我正在使用Python和lxml库从头开始创建新的XML文件。

<route xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.xxxx" version="1.1"
xmlns:stm="http://xxxx/1/0/0"
xsi:schemaLocation="http://xxxx/1/0/0 stm_extensions.xsd">

我需要将这个命名空间信息作为路由标签的属性包含在根标签中。但我无法将此信息包含在根声明中。
from lxml import etree
root = etree.Element("route",
    xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance",
    xmlns = "http://www.xxxxx",
    version = "1.1",
    xmlns: stm = "http://xxxxx/1/0/0"
)

出现了语法错误:无效的语法

我该怎么做?


可能是[Python:xml ElementTree(或lxml)中的命名空间]的重复问题(https://dev59.com/3lPTa4cB1Zd3GeqPoPyL)。 - stovfl
@stovfl:我不认为这是重复的。这个问题是关于创建一个新的XML文档;另一个问题是关于解析/操作现有文档。 - mzjn
1个回答

8
以下是如何完成此操作的方法:
from lxml import etree

attr_qname = etree.QName("http://www.w3.org/2001/XMLSchema-instance", "schemaLocation")
nsmap = {None: "http://www.xxxx",
         "stm": "http://xxxx/1/0/0",
         "xsi": "http://www.w3.org/2001/XMLSchema-instance"}

root = etree.Element("route", 
                     {attr_qname: "http://xxxx/1/0/0 stm_extensions.xsd"},
                     version="1.1", 
                     nsmap=nsmap)

print etree.tostring(root)

以下是该代码的输出结果(为了更易读,添加了换行符):

<route xmlns:stm="http://xxxx/1/0/0"
       xmlns="http://www.xxxx"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xxxx/1/0/0 stm_extensions.xsd"
       version="1.1"/>

主要的“技巧”是使用QName来创建xsi:schemaLocation属性。具有冒号的属性名称不能用作关键字参数的名称。
我已经添加了xsi前缀的声明到nsmap中,但实际上可以省略。lxml为一些众所周知的命名空间URI定义了默认前缀,包括对http://www.w3.org/2001/XMLSchema-instance的xsi前缀。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接