2009-06-12 8 views
0

De quoi ai-je besoin pour changer de sorte que le nœud Name sous FieldRef soit un attribut de FieldRef, et non un nœud enfant?Comment puis-je faire en sorte qu'un nœud de valeur soit déplacé pour être un attribut de son nœud parent?

génère actuellement le Suds savon suivant:

<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> 

Ce que je dois est le suivant:

<ns0:query> 
    <ns0:Where> 
    <ns0:Eq> 
     <ns0:FieldRef Name="_ows_ID"> 
     </ns0:FieldRef> 
     <ns0:Value>66</ns0:Value> 
    </ns0:Eq> 
    </ns0:Where> 
</ns0:query> 

La première structure xml est générée par suds à partir du code ci-dessous.

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' 

et print(q) résultats dans

(query){ 
    Where = 
     (Where){ 
     Eq = 
      (Eq){ 
       FieldRef = 
        (FieldRef){ 
        Name = "_ows_ID" 
        } 
       Value = "66" 
      } 
     } 
} 

Voici le code qui fait l'appel WS qui crée la demande de savon

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 
          ) 
+0

si Quelle est exactement la question? Vous ne pouvez pas obtenir le premier à ressembler à la seconde? – Jack

+0

@Jack Que dois-je changer pour que le nœud Name sous FieldRef soit un attribut de FieldRef, et non un nœud enfant? –

Répondre

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

Y compris XML littérales

Pour inclure littéral comme une valeur de paramètre XML (pas échappé) de l'objet attribut, vous devez définir la valeur du paramètre de l'objet attribut à un élément sax. Le marshaller est conçu pour simplement joindre et ajouter du contenu qui est déjà XML.

Par exemple, vous voulez passer le XML suivant comme paramètre:

<query> <name>Elmer Fudd</name>
<age unit="years">33</age>
<job>Wabbit Hunter</job> </query>

Le peut se faire comme suit:

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) 
Questions connexes