2010-12-07 7 views
1

Je sais que XMLSearch() retournera un tableau d'ensembles de nœuds XML. Mais ce n'est pas ce dont j'ai besoin. Par exemple, actuellement je suis sur un nœud XML et je veux passer au nœud suivant, (son frère), comment faire cela? Ce que je sais est d'utiliser XMLSearch() et XPath, mais j'ai vraiment besoin de ce que j'ai obtenu est toujours l'élément XML ou document XML plutôt que tableau.ColdFusion XMLSearch

Comment puis-je modifier le tableau retourné en XML ou existe-t-il un autre moyen?


Est-il possible d'utiliser d'abord ArrayToList puis utilisez l'utilisation XMLParse pour convertir la liste de documents XML?

Répondre

0
<!--- Create an example XML document ----> 
<cfxml variable="xml"> 

    <node1> 
     <child>hello1</child> 
     <child>hello2</child> 
    </node1> 

</cfxml> 

<!--- Search for nodes you need ---> 
<cfset res = xmlSearch(xml, "/node1/child") /> 

<!--- Output just the 2nd child as an XML document ---> 
<cfset xmlAsString = toString(res[2]) /> 

<cfdump var="#xmlAsString#" /> 

J'espère que cela aide.

+0

Cela fonctionne si les frères et sœurs ont le même nom de noeud, mais si les frères et sœurs sont des noms de noeud différents, ils ne seront pas retournés dans le tableau. –

2

Les noeuds renvoyés dans le tableau sont des références aux noeuds du document XML complet. Il existe également un "attribut" non documenté d'un nœud xml appelé xmlparent.

<cfxml variable="foo"> 
    <employee> 
     <!-- A list of employees --> 
     <name EmpType="Regular"> 
      <first>Almanzo</first> 
      <last>Wilder</last> 
      <Status>Medical Absence</Status> 
      <Status>Extended Leave</Status> 
     </name> 
     <name EmpType="Contract"> 
      <first>Laura</first> 
      <last>Ingalls</last> 
     </name> 
    </employee> 
</cfxml> 

<cfdump var="#foo#"> 

<cfset bar = xmlSearch(foo,"/employee/name/last[normalize-space()='Wilder']")> 

<!--- If you know the node name of the sibling, you can just access it ---> 
<cfdump var="#bar[1].xmlparent['first']#"> 

<!--- If you don't know the node names, and just want to traverse via preceding and following order, you can do another xpath on the returned nodes ---> 

<cfdump var="#xmlSearch(bar[1],'./preceding-sibling::*')#"> 
<cfdump var="#xmlSearch(bar[1],'./following-sibling::*')#"> 
0

Si vous souhaitez un document XML à partir d'un document XML, vous pouvez utiliser XMLTransform().

Vous auriez besoin de construire un XSLT mais, si le XPath que vous utilisez maintenant n'est pas dynamique, cela fonctionnerait.
Si vous n'êtes pas familier avec XSLT, vous avez une nouvelle petite courbe d'apprentissage, mais c'est une courbe utile à gravir.