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>
解析后,它们的结构将相等,它们的命名空间映射将不同。
我正在尝试从 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>
解析后,它们的结构将相等,它们的命名空间映射将不同。