我正在尝试从python应用程序创建XML导出,并且需要以特定的方式为文件的外部接收者构造文件。
根节点需要命名空间,但子节点不应该。
应该的根节点如下所示:
<ns0:SalesInvoice_Custom_Xml xmlns:ns0="http://EDI-export/Invoice">...</ns0:SalesInvoice_Custom_Xml>我尝试使用Python2.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生成正确的根节点,我应该修改代码中的哪些内容
发布于 2017-12-20 12:59:50
你需要用
rootNs = etree.QName(ns0, "SalesInvoice_Custom_Xml")使用
ns0 = "http://EDI-export/Invoice"整个数据结构本身与您以后可能应用的任何命名空间映射都不相关,例如,标记知道真正的名称空间(例如http://EDI-export/Invoice),而不是它们的映射(例如,ns0)。
稍后,当您最终将其序列化为字符串时,需要进行名称空间映射。然后(只有到那时)将使用名称空间映射。
此外,解析之后,您可以问etree对象在解析过程中找到了什么名称空间映射。但这不是结构的一部分,它只是关于如何将结构编码为字符串的附加信息。请考虑以下两个XML在逻辑上是相等的:
<x:tag xmlns:x="namespace"></x:tag>和
<y:tag xmlns:y="namespace"></y:tag>解析之后,它们的结构将是相等的,它们的命名空间映射则不会。
https://stackoverflow.com/questions/47906569
复制相似问题