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

Python LXML create xml with specific namespace and structure

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

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

的根节点应该是这样的:

<ns0:SalesInvoice_Custom_Xml xmlns:ns0="http://EDI-export/Invoice">...</ns0:SalesInvoice_Custom_Xml>

我曾尝试在 Python 2.7 上使用 lxml 库生成相同的节点,但它的行为与预期不符。

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

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"
    })

这给出了以下输出

<ns1:SalesInvoice_Custom_Xml xmlns:ns0="http://EDI-export/Invoice" xmlns:ns1="ns0">...</ns1:SalesInvoice_Custom_Xml>

我应该在我的代码中更改什么才能使 lxml 生成正确的根节点

你需要使用

rootNs = etree.QName(ns0, "SalesInvoice_Custom_Xml")

ns0 = "http://EDI-export/Invoice"

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

稍后,当您最终将其序列化为字符串时,需要进行命名空间映射。 然后(并且仅在那时)将使用命名空间映射。

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

<x:tag xmlns:x="namespace"></x:tag>

<y:tag xmlns:y="namespace"></y:tag>

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