首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在lxml.objectify中设置子值

无法在lxml.objectify中设置子值
EN

Stack Overflow用户
提问于 2018-02-15 17:31:58
回答 1查看 373关注 0票数 0

我正在尝试使用使用XML的restful接口。我已经将XML库的选择缩小到了两个。

基于文档,lxml.objectify似乎是我的首选选择,但我正在挣扎。

Xmltodict似乎产生了更多的打字,可能是较少的丙酮,但我似乎能够取得更大的进展。

我有一个两个都做过的例子。Xmltodict正在工作,但使用xml.objectify,我似乎找不出如何访问/更改凭据的子元素。我的假设是,我可以使用点表示法下到用户名和密码,但我没有成功。

首先,xmltodict代码:

代码语言:javascript
复制
    from requests import post
import xmltodict
import pprint

pp=pprint.PrettyPrinter(indent=2)

req = '''<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
     <soap:Header>
          <HTNGHeader xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://htng.org/1.1/Header/">
               <From>
                    <Credential>
                         <password>PASSWORD</password>
                         <userName>UNAME</userName>
                    </Credential>
                    <systemId>2</systemId>
                </From>
                <To>
                     <systemId>2178</systemId>
                </To>
         </HTNGHeader>
     </soap:Header>
     <soap:Body />
</soap:Envelope>
'''

pwd = 'password'
uname = 'username'
url = 'https://url.com'

soap = xmltodict.parse(req)
soap['soap:Envelope']['soap:Header']['HTNGHeader']['From']['Credential']['password'] = pwd
soap['soap:Envelope']['soap:Header']['HTNGHeader']['From']['Credential']['userName'] = uname

soap_post = xmltodict.unparse(soap)

res = post(url, data=soap_post)

res_dict = xmltodict.parse(res.text)
pp.pprint(res_dict)

现在,lxml.objectify。

代码语言:javascript
复制
    from requests import post
from lxml import etree, objectify
import pprint

pp=pprint.PrettyPrinter(indent=2)

req = '''<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
     <soap:Header>
          <HTNGHeader xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://htng.org/1.1/Header/">
               <From>
                    <Credential>
                         <password>PASSWORD</password>
                         <userName>UNAME</userName>
                    </Credential>
                    <systemId>2</systemId>
                </From>
                <To>
                     <systemId>2178</systemId>
                </To>
         </HTNGHeader>
     </soap:Header>
     <soap:Body />
</soap:Envelope>
'''

request_doc = req.encode('utf-8')

pwd = 'password'
uname = 'username'
url = 'https://url.com

soap = objectify.fromstring(request_doc)

#here is my problem
soap.Header.HTNGHeader.From.Credential.userName = uname
soap.Header.HTNGHeader.From.Credential.password = pwd

soap_post = etree.tostring(soap)

url = 'https://connect.channelrush.net/reservationreceive/pickup?providerId=2'

res = post(url, data=soap_post)

res_obj = objectify.fromstring(res.text.encode('utf-8'))

pp.pprint(res.text)

对于lxml.objectify,我得到以下异常:

代码语言:javascript
复制
File "f:\Dropbox\pms\channel_rush_interface_objectify.py", line 36, in <module>
  soap.Header.HTNGHeader.From.Credential.userName = uname
File "c:\Python34\Lib\site-packages\lxml\objectify.pyd", line 230, in lxml.objectify.ObjectifiedElement.__getattr__ (src\lxml\objectify.c:4443)
File "c:\Python34\Lib\site-packages\lxml\objectify.pyd", line 451, in lxml.objectify._lookupChildOrRaise (src\lxml\objectify.c:7228)

builtins.AttributeError: no such child: {http://schemas.xmlsoap.org/soap/envelope/}HTNGHeader

有人能指出我如何让lxml.objectify工作吗?我应该坚持使用xmltodict吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-15 18:11:01

来自lxml.objectify文档

在标记查找期间,名称空间主要是在幕后处理的。如果您访问元素的子元素而不指定命名空间,则查找将使用父元素的命名空间。..。要访问与其父名称空间不同的元素,可以使用getattr() .为了方便起见,还有一种快速通过项目访问的方法。除去的例子

在你的例子中,试着:

代码语言:javascript
复制
soap.Header["{http://htng.org/1.1/Header/}HTNGHeader"].From.Credential.userName = uname
soap.Header["{http://htng.org/1.1/Header/}HTNGHeader"].From.Credential.password = pwd
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48813109

复制
相关文章

相似问题

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