2010-04-08 4 views
4

Je travaille sur une intégration de Plesk en utilisant l'API XML et j'essaie de comprendre comment analyser la réponse XML que je récupère. La plupart des données sont correctes, mais le http://download1.parallels.com/Plesk/PPP9/Doc/en-US/plesk-9.2-api-rpc/index.htm?fileName=28788.htm>Limites et autorisations sont mis en place différemment. Essentiellement, ils sont présentés comme ceci:Extraire les paires nom/valeur XML de différents nœuds dans Coldfusion

<data> 
    <limits> 
    <limit> 
     <name>foo</name> 
     <value>bar</value> 
    </limit> 
    <limit> 
     <name>foo2</name> 
     <value>bar2</value> 
    </limit> 
    </limits> 
</data> 

Comment puis-je extraire « bar » du xml étant donné que je sais que je veux la valeur de « foo », mais pas la valeur de « foo2 »?

Répondre

7
<cfset my_xml = XmlParse(XMLCODE) /> 

<cfoutput> 
1: #my_xml.data.limits[0].limit.value# 
<br />2: #my_xml.data.limits[1].limit.value# 
</cfoutput> 
+0

Merci pour l'aide. Je pensais qu'il pourrait y avoir un moyen où je n'ai pas eu à spécifier manuellement le numéro de nœud (au cas où il serait changé à un moment donné) mais cela semble être la meilleure réponse que je pourrais trouver. Je devrais probablement souligner que j'ai dû déplacer le [0] à après la limite et que j'ai dû spécifier .xmlText après la valeur, mais cela peut être dû à moi expliquant mal le problème. –

+0

Vous pouvez avoir une boucle sur my_xml.data.limits qui vous donnera toutes les valeurs limit.value si vous cherchez un moyen de les obtenir tous. –

1

Si vous savez précisément quel sera le "nom" de la limite, vous pouvez utiliser XPath pour cela. Ce que vous cherchez, c'est le nœud enfant "value" des noeuds limites où le nom du noeud enfant est "foo". Dans XPath, cela ressemble à:

'/data/limits/limit[name = 'foo']/value' 

Cela retournera un tableau de noeuds (car il peut y avoir plusieurs correspondances), nous avons donc besoin de gérer le tableau. L'exemple entier est:

<cfset myXML = " 
    <data> 
     <limits> 
     <limit> 
      <name>foo</name> 
      <value>bar</value> 
     </limit> 
     <limit> 
      <name>foo2</name> 
      <value>bar2</value> 
     </limit> 
     </limits> 
    </data> 
"> 
<!--- Parse the string into an XML Object ---> 
<cfset XMLDOM = xmlParse(myXML)> 
<!--- Search the XML Object for specific nodes ---> 
<cfset nodeArray = xmlSearch(XMLDOM,"/data/limits/limit[name = 'foo']/value")> 
<!--- Loop over the returned array of XML Node objects and print the XMLText (the node value) ---> 
<cfloop array="#nodeArray#" index="thisNode"> 
    <cfoutput>#thisNode.xmlText#</cfoutput> 
</cfloop> 
Questions connexes