首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python创建具有特定命名空间和结构的xml

问Python创建具有特定命名空间和结构的xml
EN

Stack Overflow用户
提问于 2017-12-20 12:54:33
回答 1查看 1.1K关注 0票数 0

我正在尝试从python应用程序创建XML导出,并且需要以特定的方式为文件的外部接收者构造文件。

根节点需要命名空间,但子节点不应该。

应该的根节点如下所示:

代码语言:javascript
复制
<ns0:SalesInvoice_Custom_Xml xmlns:ns0="http://EDI-export/Invoice">...</ns0:SalesInvoice_Custom_Xml>

我尝试使用Python2.7上的lxml库生成相同的节点,但它的行为并不像预期的那样。

下面是应该生成根节点的代码:

代码语言:javascript
复制
def create_edi(self, document):
    _logger.info("INFO: Started creating EDI invoice with invoice number %s", document.number)
    rootNs = etree.QName("ns0", "SalesInvoice_Custom_Xml")
    doc = etree.Element(rootNs, nsmap={
        'ns0': "http://EDI-export/Invoice"
    })

这提供了以下输出

代码语言:javascript
复制
<ns1:SalesInvoice_Custom_Xml xmlns:ns0="http://EDI-export/Invoice" xmlns:ns1="ns0">...</ns1:SalesInvoice_Custom_Xml>

要让lxml生成正确的根节点,我应该修改代码中的哪些内容

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-20 12:59:50

你需要用

代码语言:javascript
复制
rootNs = etree.QName(ns0, "SalesInvoice_Custom_Xml")

使用

代码语言:javascript
复制
ns0 = "http://EDI-export/Invoice"

整个数据结构本身与您以后可能应用的任何命名空间映射都不相关,例如,标记知道真正的名称空间(例如http://EDI-export/Invoice),而不是它们的映射(例如,ns0)。

稍后,当您最终将其序列化为字符串时,需要进行名称空间映射。然后(只有到那时)将使用名称空间映射。

此外,解析之后,您可以问etree对象在解析过程中找到了什么名称空间映射。但这不是结构的一部分,它只是关于如何将结构编码为字符串的附加信息。请考虑以下两个XML在逻辑上是相等的:

代码语言:javascript
复制
<x:tag xmlns:x="namespace"></x:tag>

和

代码语言:javascript
复制
<y:tag xmlns:y="namespace"></y:tag>

解析之后,它们的结构将是相等的,它们的命名空间映射则不会。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47906569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档