简体   繁体   English

如何使用 Python LXML 在根 XML 中添加名称空间前缀?

[英]How to add namespace prefix at root XML using Python LXML?

I would like to have the following NS prefix <qsp: and </qsp:我想要以下 NS 前缀<qsp:</qsp:

<qsp:QSPart xmlns:qsp="urn:qvalent:quicksuper:gateway">
  <qsp:MemberRegistrationRequest/>
</qsp:QSPart>

How do I do that in LMXL python?我如何在 LMXL python 中做到这一点?

from lxml import etree

nsmap = {'qsp': 'urn:qvalent:quicksuper:gateway'}
nsprefix = nsmap['qsp']

QSPart = etree.Element('QSPart', nsmap=nsmap)
MemberRegistrationRequest = etree.SubElement(QSPart, etree.QName(nsprefix, 'MemberRegistrationRequest'))

print(etree.tostring(QSPart, pretty_print=True, encoding=str))

Result:结果:

<QSPart xmlns:qsp="urn:qvalent:quicksuper:gateway">
  <qsp:MemberRegistrationRequest/>
</QSPart>

According to the documentation , you need to fully qualify the element name in your call to etree.Element :根据文档,您需要在调用etree.Element时完全限定元素名称:

from lxml import etree

nsmap = {'qsp': 'urn:qvalent:quicksuper:gateway'}
nsprefix = nsmap['qsp']

QSPart = etree.Element(f'{{{nsmap["qsp"]}}}QSPart')
MemberRegistrationRequest = etree.SubElement(QSPart, etree.QName(nsprefix, 'MemberRegistrationRequest'))

print(etree.tostring(QSPart, pretty_print=True, encoding=str))

This outputs:这输出:

<ns0:QSPart xmlns:ns0="urn:qvalent:quicksuper:gateway">
  <ns0:MemberRegistrationRequest/>
</ns0:QSPart>

Since you know your expected output, I wouldn't bother with all that (though I understand many people frown on this approach...) - just use from and to string:既然你知道你的预期输出,我就不会理会所有这些(尽管我知道很多人不赞成这种方法......) - 只需使用 from 和 to string:

frag_text = """<qsp:QSPart xmlns:qsp="urn:qvalent:quicksuper:gateway">
  <qsp:MemberRegistrationRequest/>
</qsp:QSPart>"""
fragment = etree.fromstring(frag_text)
print(etree.tostring(fragment).decode())

Output should be your expected output.输出应该是您的预期输出。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM