2017-09-25 70 views
1

我使用python和lxml库从头开始创建一个新的xml文件。如何使用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" 
) 

有一个语法错误:无效的语法

我怎样才能做到这一点?

+0

[Python:命名空间在XML ElementTree(或lxml)]中可能的重复](https://stackoverflow.com/questions/4886189/python-namespaces-in-xml-elementtree-or-lxml) – stovfl

+0

@stovfl:I不要认为它是重复的。这个问题是关于创建一个新的XML文档;另一个是关于解析/操作现有文档。 – mzjn

回答

1

这里是如何可以做到:

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

相关问题