XML: 从命名空间生成带有前缀的标签
XML: generate tags with prefix from namespaces
我需要使用代表命名空间的不同前缀生成 XML:
例如,我有这个命名空间列表:
class XMLNamespaces:
empty="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
ccts="urn:un:unece:uncefact:documentation:2"
ds="http://www.w3.org/2000/09/xmldsig#"
ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"
qdt="urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2"
sac="urn:sunat:names:specification:ubl:peru:schema:xsd:SunatAggregateComponents-1"
udt="urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2"
xsi="http://www.w3.org/2001/XMLSchema-instance"
# create XML
NSMAP={None:XMLNamespaces.empty, 'cac':XMLNamespaces.cac, 'cbc':XMLNamespaces.cbc,
'ccts':XMLNamespaces.ccts, 'ds':XMLNamespaces.ds, 'ext':XMLNamespaces.ext,
'qdt':XMLNamespaces.qdt, 'sac':XMLNamespaces.sac, 'udt':XMLNamespaces.udt,
'xsi':XMLNamespaces.xsi}
我想生成这个结构:
只有 Invoice 标记具有完整的命名空间。
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
xmlns:ccts="urn:un:unece:uncefact:documentation:2"
xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"
xmlns:qdt="urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2"
xmlns:sac="urn:sunat:names:specification:ubl:peru:schema:xsd:SunatAggregateComponents-1"
xmlns:udt="urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ext:UBLExtensions>
<ext:UBLExtension>
<ext:ExtensionContent>
<sac:AdditionalInformation>
</sac:AdditionalInformation>
</ext:ExtensionContent>
</ext:UBLExtension>
</Invoice>
我的代码:
from lxml import etree
from lxml.etree import Element, SubElement, QName, tostring
class XMLNamespaces:
empty="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
ccts="urn:un:unece:uncefact:documentation:2"
ds="http://www.w3.org/2000/09/xmldsig#"
ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"
qdt="urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2"
sac="urn:sunat:names:specification:ubl:peru:schema:xsd:SunatAggregateComponents-1"
udt="urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2"
xsi="http://www.w3.org/2001/XMLSchema-instance"
NSMAP={None:XMLNamespaces.empty, 'cac':XMLNamespaces.cac, 'cbc':XMLNamespaces.cbc,
'ccts':XMLNamespaces.ccts, 'ds':XMLNamespaces.ds, 'ext':XMLNamespaces.ext,
'qdt':XMLNamespaces.qdt, 'sac':XMLNamespaces.sac, 'udt':XMLNamespaces.udt,
'xsi':XMLNamespaces.xsi}
invoice = etree.Element("Invoice", nsmap=NSMAP) # lxml only!
ublextensions = etree.SubElement(invoice, "UBLExtensions", nsmap=NSMAP['ext'])
print(etree.tostring(invoice, pretty_print=True))
但是 returns:
File "xml-building.py", line 27, in <module>
ublextensions = etree.SubElement(invoice, "UBLExtensions", nsmap=NSMAP['ext'])
File "src\lxml\etree.pyx", line 3135, in lxml.etree.SubElement
File "src\lxml\apihelpers.pxi", line 199, in lxml.etree._makeSubElement
File "src\lxml\apihelpers.pxi", line 193, in lxml.etree._makeSubElement
File "src\lxml\apihelpers.pxi", line 213, in lxml.etree._setNodeNamespaces
File "src\lxml\apihelpers.pxi", line 274, in lxml.etree._iter_nsmap
TypeError: 'in <string>' requires string as left operand, not NoneType
您不需要在子元素中添加 nsmap
。删除它并在大括号中添加,在每个元素的 id 之前,所需的名称空间(见下文,我为此使用了一个额外的字典)。它会如你所愿地工作:
from lxml import etree
from lxml.etree import Element, SubElement, QName, tostring
class XMLNamespaces:
empty="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
ccts="urn:un:unece:uncefact:documentation:2"
ds="http://www.w3.org/2000/09/xmldsig#"
ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"
qdt="urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2"
sac="urn:sunat:names:specification:ubl:peru:schema:xsd:SunatAggregateComponents-1"
udt="urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2"
xsi="http://www.w3.org/2001/XMLSchema-instance"
NSMAP={None:XMLNamespaces.empty, 'cac':XMLNamespaces.cac, 'cbc':XMLNamespaces.cbc,
'ccts':XMLNamespaces.ccts, 'ds':XMLNamespaces.ds, 'ext':XMLNamespaces.ext,
'qdt':XMLNamespaces.qdt, 'sac':XMLNamespaces.sac, 'udt':XMLNamespaces.udt,
'xsi':XMLNamespaces.xsi}
ns = {k:'{' + v + '}' for k,v in NSMAP.items()}
invoice = etree.Element("Invoice", nsmap=NSMAP) # lxml only!
ublextensions = etree.SubElement(invoice, f"{ns['ext']}UBLExtensions")
ublextension = etree.SubElement(ublextensions, f"{ns['ext']}UBLExtension")
extcontent = etree.SubElement(ublextension, f"{ns['ext']}ExtensionContent")
addinfo = etree.SubElement(extcontent, f"{ns['sac']}AdditionalInformation")
print(etree.tostring(invoice, pretty_print=True).decode('ascii'))
结果:
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
xmlns:ccts="urn:un:unece:uncefact:documentation:2"
xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"
xmlns:qdt="urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2"
xmlns:sac="urn:sunat:names:specification:ubl:peru:schema:xsd:SunatAggregateComponents-1"
xmlns:udt="urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ext:UBLExtensions>
<ext:UBLExtension>
<ext:ExtensionContent>
<sac:AdditionalInformation/>
</ext:ExtensionContent>
</ext:UBLExtension>
</ext:UBLExtensions>
</Invoice>
我需要使用代表命名空间的不同前缀生成 XML:
例如,我有这个命名空间列表:
class XMLNamespaces:
empty="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
ccts="urn:un:unece:uncefact:documentation:2"
ds="http://www.w3.org/2000/09/xmldsig#"
ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"
qdt="urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2"
sac="urn:sunat:names:specification:ubl:peru:schema:xsd:SunatAggregateComponents-1"
udt="urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2"
xsi="http://www.w3.org/2001/XMLSchema-instance"
# create XML
NSMAP={None:XMLNamespaces.empty, 'cac':XMLNamespaces.cac, 'cbc':XMLNamespaces.cbc,
'ccts':XMLNamespaces.ccts, 'ds':XMLNamespaces.ds, 'ext':XMLNamespaces.ext,
'qdt':XMLNamespaces.qdt, 'sac':XMLNamespaces.sac, 'udt':XMLNamespaces.udt,
'xsi':XMLNamespaces.xsi}
我想生成这个结构:
只有 Invoice 标记具有完整的命名空间。
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
xmlns:ccts="urn:un:unece:uncefact:documentation:2"
xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"
xmlns:qdt="urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2"
xmlns:sac="urn:sunat:names:specification:ubl:peru:schema:xsd:SunatAggregateComponents-1"
xmlns:udt="urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ext:UBLExtensions>
<ext:UBLExtension>
<ext:ExtensionContent>
<sac:AdditionalInformation>
</sac:AdditionalInformation>
</ext:ExtensionContent>
</ext:UBLExtension>
</Invoice>
我的代码:
from lxml import etree
from lxml.etree import Element, SubElement, QName, tostring
class XMLNamespaces:
empty="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
ccts="urn:un:unece:uncefact:documentation:2"
ds="http://www.w3.org/2000/09/xmldsig#"
ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"
qdt="urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2"
sac="urn:sunat:names:specification:ubl:peru:schema:xsd:SunatAggregateComponents-1"
udt="urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2"
xsi="http://www.w3.org/2001/XMLSchema-instance"
NSMAP={None:XMLNamespaces.empty, 'cac':XMLNamespaces.cac, 'cbc':XMLNamespaces.cbc,
'ccts':XMLNamespaces.ccts, 'ds':XMLNamespaces.ds, 'ext':XMLNamespaces.ext,
'qdt':XMLNamespaces.qdt, 'sac':XMLNamespaces.sac, 'udt':XMLNamespaces.udt,
'xsi':XMLNamespaces.xsi}
invoice = etree.Element("Invoice", nsmap=NSMAP) # lxml only!
ublextensions = etree.SubElement(invoice, "UBLExtensions", nsmap=NSMAP['ext'])
print(etree.tostring(invoice, pretty_print=True))
但是 returns:
File "xml-building.py", line 27, in <module>
ublextensions = etree.SubElement(invoice, "UBLExtensions", nsmap=NSMAP['ext'])
File "src\lxml\etree.pyx", line 3135, in lxml.etree.SubElement
File "src\lxml\apihelpers.pxi", line 199, in lxml.etree._makeSubElement
File "src\lxml\apihelpers.pxi", line 193, in lxml.etree._makeSubElement
File "src\lxml\apihelpers.pxi", line 213, in lxml.etree._setNodeNamespaces
File "src\lxml\apihelpers.pxi", line 274, in lxml.etree._iter_nsmap
TypeError: 'in <string>' requires string as left operand, not NoneType
您不需要在子元素中添加 nsmap
。删除它并在大括号中添加,在每个元素的 id 之前,所需的名称空间(见下文,我为此使用了一个额外的字典)。它会如你所愿地工作:
from lxml import etree
from lxml.etree import Element, SubElement, QName, tostring
class XMLNamespaces:
empty="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
ccts="urn:un:unece:uncefact:documentation:2"
ds="http://www.w3.org/2000/09/xmldsig#"
ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"
qdt="urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2"
sac="urn:sunat:names:specification:ubl:peru:schema:xsd:SunatAggregateComponents-1"
udt="urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2"
xsi="http://www.w3.org/2001/XMLSchema-instance"
NSMAP={None:XMLNamespaces.empty, 'cac':XMLNamespaces.cac, 'cbc':XMLNamespaces.cbc,
'ccts':XMLNamespaces.ccts, 'ds':XMLNamespaces.ds, 'ext':XMLNamespaces.ext,
'qdt':XMLNamespaces.qdt, 'sac':XMLNamespaces.sac, 'udt':XMLNamespaces.udt,
'xsi':XMLNamespaces.xsi}
ns = {k:'{' + v + '}' for k,v in NSMAP.items()}
invoice = etree.Element("Invoice", nsmap=NSMAP) # lxml only!
ublextensions = etree.SubElement(invoice, f"{ns['ext']}UBLExtensions")
ublextension = etree.SubElement(ublextensions, f"{ns['ext']}UBLExtension")
extcontent = etree.SubElement(ublextension, f"{ns['ext']}ExtensionContent")
addinfo = etree.SubElement(extcontent, f"{ns['sac']}AdditionalInformation")
print(etree.tostring(invoice, pretty_print=True).decode('ascii'))
结果:
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
xmlns:ccts="urn:un:unece:uncefact:documentation:2"
xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"
xmlns:qdt="urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2"
xmlns:sac="urn:sunat:names:specification:ubl:peru:schema:xsd:SunatAggregateComponents-1"
xmlns:udt="urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ext:UBLExtensions>
<ext:UBLExtension>
<ext:ExtensionContent>
<sac:AdditionalInformation/>
</ext:ExtensionContent>
</ext:UBLExtension>
</ext:UBLExtensions>
</Invoice>