首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有多个NameSpaces的lxml - XML文档

具有多个NameSpaces的lxml - XML文档
EN

Stack Overflow用户
提问于 2015-01-20 20:21:03
回答 3查看 2K关注 0票数 3

是否有可能使用lxml构建XML作为这个XML?

代码语言:javascript
复制
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns0="http://xmlns.CLT.com/consume/ENTBUS" xmlns:ns1="http://xmlns.CLT.com/Core/ENTBUS" xmlns:ns2="http://xmlns.CLT.com/output/EBO">
   <soapenv:Header/>
   <soapenv:Body>
      <ns0:ConsumptionRequestENTBUS>
         <ns1:ENTBUSHeader>
            <ns1:ENTBUSID>1</ns1:ENTBUSID>
         </ns1:ENTBUSHeader>
         <ns0:Zone>
            <ns2:Consumption>
               <ns2:BusCode>1</ns2:BusCode>
            </ns2:Consumption>
         </ns0:Zone>
      </ns0:ConsumptionRequestENTBUS>
   </soapenv:Body>
</soapenv:Envelope>

我试着按下面的方式构建根元素,但失败了。几乎每个元素都需要命名空间引用。

代码语言:javascript
复制
>>> from lxml import etree
>>> root = etree.Element("soapenv:Envelope")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "lxml.etree.pyx", line 2811, in lxml.etree.Element (src\lxml\lxml.etree.c:65389)
  File "apihelpers.pxi", line 103, in lxml.etree._makeElement (src\lxml\lxml.etree.c:13898)
  File "apihelpers.pxi", line 1575, in lxml.etree._tagValidOrRaise (src\lxml\lxml.etree.c:27955)
ValueError: Invalid tag name u'soapenv:Envelope'

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-20 22:16:18

我用以下的方式解决了这个问题。任何使这一点变得更好的建议都是最受欢迎的。

代码语言:javascript
复制
>>> from lxml import etree
>>> SOAPENV_NAMESPACE = "http://schemas.xmlsoap.org/soap/envelope"
>>> SOAPENV = "{%s}" % SOAPENV_NAMESPACE
>>> ns0_NAMESPACE = "http://xmlns.CLT.com/consume/ENTBUS"
>>> ns0 = "{%s}" % ns0_NAMESPACE
>>> ns1_NAMESPACE = "http://xmlns.CLT.com/Core/ENTBUS"
>>> ns1 = "{%s}" % ns1_NAMESPACE
>>> ns2_NAMESPACE = "http://xmlns.CLT.com/output/EBO"
>>> ns2 = "{%s}" % ns2_NAMESPACE
>>> NSMAP = {'SoapEnv' : SOAPENV_NAMESPACE,'ns0':ns0_NAMESPACE,'ns1':ns1_NAMESPACE,'ns2':ns2_NAMESPACE}
>>> envelope = etree.Element(SOAPENV + "Envelope", nsmap=NSMAP)
>>> ConsumptionRequestENTBUS=etree.SubElement(envelope, ns0 + "ConsumptionRequestENTBUS", nsmap=NSMAP)
>>> ENTBUS=etree.SubElement(ConsumptionRequestENTBUS, ns1 + "ENTBUS", nsmap=NSMAP)
>>> ENTBUSHeader=etree.SubElement(ENTBUS, ns1 + "ENTBUSHeader", nsmap=NSMAP)
>>> ENTBUSDetail=etree.SubElement(ENTBUSHeader, ns2 + "ENTBUSDetail", nsmap=NSMAP)
>>> print(etree.tostring(envelope, pretty_print=True))
<SoapEnv:Envelope xmlns:ns0="http://xmlns.CLT.com/consume/ENTBUS" xmlns:ns1="http://xmlns.CLT.com/Core/ENTBUS" xmlns:ns2="h
ttp://xmlns.CLT.com/output/EBO" xmlns:SoapEnv="http://schemas.xmlsoap.org/soap/envelope">
  <ns0:ConsumptionRequestENTBUS>
    <ns1:ENTBUS>
      <ns1:ENTBUSHeader>
        <ns2:ENTBUSDetail/>
      </ns1:ENTBUSHeader>
    </ns1:ENTBUS>
  </ns0:ConsumptionRequestENTBUS>
</SoapEnv:Envelope>
票数 1
EN

Stack Overflow用户

发布于 2015-01-20 20:54:28

lxml教程中有一个关于命名空间的部分。但是,如果您实际上是在与SOAP you服务通信,我建议您在可能的情况下使用一个适当的库,如suds或soapbox。

票数 0
EN

Stack Overflow用户

发布于 2022-09-14 15:39:16

不确定这样做是否更好,但另一种方法是:

代码语言:javascript
复制
from lxml import etree
from lxml.builder import ElementMaker


nslist = {
        'soapenv':'http://schemas.xmlsoap.org/soap/envelope/',
        'ns0':'http://xmlns.CLT.com/consume/ENTBUS',
        'ns1':'http://xmlns.CLT.com/Core/ENTBUS',
        'ns2':'http://xmlns.CLT.com/output/EBO', 
        None: 'http://schemas.xmlsoap.org/soap/envelope/'}
 
E = ElementMaker(namespace="http://schemas.xmlsoap.org/soap/envelope/", nsmap=nslist)
E0 = ElementMaker(namespace="http://xmlns.CLT.com/consume/ENTBUS", nsmap={'ns0':'http://xmlns.CLT.com/consume/ENTBUS'})
E1 = ElementMaker(namespace="http://xmlns.CLT.com/Core/ENTBUS", nsmap={'ns0':'http://xmlns.CLT.com/Core/ENTBUS'})
E2 = ElementMaker(namespace="http://xmlns.CLT.com/output/EBO", nsmap={'ns2':'http://xmlns.CLT.com/output/EBO'})

out = E.Envelope(
    E.Header(), 
    E.Body(
        E0.ConsumptionRequestENTBUS(
            E1.ENTBUSHeader(
                E1.ENTBUSID('1')
            ),
            E0.Zone(
                E2.Consumption(
                    E2.BusCode('1')
                )
            )
        )
    )
)

print(etree.tostring(out, encoding="UTF-8", standalone="yes", pretty_print=True))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28054444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档