微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我正在使用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"
)

一个SyntaxError:无效的语法

我怎样才能做到这一点 ?

解决方法:

以下是它的完成方式:

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属性.名称中带冒号的属性不能用作关键字参数名称.

我已经向nsmap添加了xsi前缀的声明,但实际上可以省略它. lxml定义了一些众所周知的名称空间URI的认前缀,包括http://www.w3.org/2001/XMLSchema-instance的xsi.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。