如何将值节点上移为其父节点的属性?
我需要做什么改变,让FieldRef下的Name节点变成FieldRef的一个属性,而不是一个子节点?
Suds现在生成的soap是:
<ns0:query>
<ns0:Where>
<ns0:Eq>
<ns0:FieldRef>
<ns0:Name>_ows_ID</ns0:Name>
</ns0:FieldRef>
<ns0:Value>66</ns0:Value>
</ns0:Eq>
</ns0:Where>
</ns0:query>
我需要的是这个:
<ns0:query>
<ns0:Where>
<ns0:Eq>
<ns0:FieldRef Name="_ows_ID">
</ns0:FieldRef>
<ns0:Value>66</ns0:Value>
</ns0:Eq>
</ns0:Where>
</ns0:query>
第一个xml结构是由suds根据下面的代码生成的。
q = c.factory.create('GetListItems.query')
q['Where']=InstFactory.object('Where')
q['Where']['Eq']=InstFactory.object('Eq')
q['Where']['Eq']['FieldRef']=InstFactory.object('FieldRef')
q['Where']['Eq']['FieldRef'].Name='_ows_ID'
q['Where']['Eq']['Value']='66'
而且print(q)
的结果是
(query){
Where =
(Where){
Eq =
(Eq){
FieldRef =
(FieldRef){
Name = "_ows_ID"
}
Value = "66"
}
}
}
这里是用来发起WS调用并创建soap请求的代码
c = client.Client(url='https://community.site.edu/_vti_bin/Lists.asmx?WSDL',
transport=WindowsHttpAuthenticated(username='domain\user',
password='password')
)
ll= c.service.GetListItems(listName="{BD59F6D9-AB4B-474D-BCC7-E4B4BEA7EB27}",
viewName="{407A6AB9-97CF-4E1F-8544-7DD67CEA997B}",
query=q
)
1 个回答
0
from suds.sax.element import Element
#create the nodes
q = Element('query')
where=Element('Where')
eq=Element('Eq')
fieldref=Element('FieldRef')
fieldref.set('Name', '_ows_ID')
value=Element('Value')
value.setText('66')
#append them
eq.append(fieldref)
eq.append(value)
where.append(eq)
q.append(where)
https://fedorahosted.org/suds/wiki/TipsAndTricks
包含原始XML
如果你想把原始的(没有转义的)XML作为对象属性的参数值,你需要把这个参数的值设置为一个sax元素。这个marshaller的设计就是为了简单地附加和追加已经是XML的内容。
举个例子,假设你想传递以下的XML作为参数:
<query> <name>Elmer Fudd</name>
<age unit="years">33</age>
<job>Wabbit Hunter</job> </query>
你可以这样做:
from suds.sax.element import Element query = Element('query') name = Element('name').setText('Elmer Fudd') age = Element('age').setText('33') age.set('units', 'years') job = Element('job').setText('Wabbit Hunter') query.append(name) query.append(age) query.append(job) client.service.runQuery(query)