2009-06-12 1 views
6

das folgende XML Gegeben:Richtige oder falsche Möglichkeit, in XML-Element mit XMLSearch zu suchen?

<cfsavecontent variable="xml"> 
<root> 
    <parent> 
     <child>I'm the first</child> 
     <child>Second</child> 
     <child>3rd</child> 
    </parent> 
    <parent> 
     <child>Only child</child> 
    </parent> 
    <parent> 
     <child>I'm 10</child> 
     <child>I'm 11!</child> 
    </parent> 
</root> 
</cfsavecontent> 

Ist dies der beste Weg, über jeden Elternteil in einer Schleife und dann alle Kinder von diesem Elternteil extrahiert?

Der Grund, warum ich frage, ist, dass ich nie alle untergeordneten Elemente aus dem aktuellen XML-Element extrahieren konnte.

Die "Ist das nötig?" Der Kommentar hebt die Zeile hervor, die ich hinzugefügt habe, damit die vorgehende Zeile funktioniert. Aber ist es möglich, diese Zeile zu entfernen und irgendwie 'XMLSearch (parent, "// child") zu ändern, um nur untergeordnete Elemente vom aktuellen "Elternteil" zu erhalten?

Danke.

+0

+1 - Es ist in der Tat Art Gegen intuitiv, dass CF scheint nicht zu Kontext in XmlSearch() ehren. – Tomalak

Antwort

8
<cfset parent = XMLParse(parent)><!--- Is this needed? ---> 

Nein, ist es nicht. Es ist sogar eine Leistungseinbuße, weil Sie auf diese Weise ein neues DOM erstellen.

Sie erhalten ein Array von XML-Knoten zurück von XmlSearch() (warum sonst würden Sie <cfloop array... verwenden?). Das bedeutet, diese gleichwertig sein sollte:

<!-- new CF8 syntax --> 
<cfloop array="#parents#" index="parent"> 
    <cfdump var="#parent#"> 
</cfloop> 

<!-- old syntax --> 
<cfloop from="1" to="#ArrayLen(parents)#" index="i"> 
    <cfdump var="#parents[i]#"> 
</cfloop> 

Um Coldfusion Ehre Kontext zu machen, wenn ein Knoten suchen, was Sie tun müssen:

XMLSearch(parent, ".//child") 
-------------------^ 

Wenn Sie einen XPath-Ausdruck mit "//" starten, Coldfusion sucht offensichtlich die gesamte Dokument, zu dem der Knoten gehört, nicht nur die Nachkommen dieses Knotens.

Aber wenn Sie bei der Ausgabe alle<child> Elemente aus dem Dokument interessiert sind, warum dies nicht tun, anstatt:

<cfset children = XMLSearch(xml, "//child")> 
+0

Yup, ich verstehe das, aber wenn ich über diese Elternknoten schleife, möchte ich in jedem einzelnen suchen. Ich habe nicht in der Lage gewesen, mit einer Version von dieser Linie zu kommen ... ... also dachte ich, wiederum ‚Eltern‘ aus ein XML-Element, in ein XML-Dokument und dann ist der XPath einfacher. –

+0

Sorry, kommentiert basierend auf Ihrem ersten Entwurf. Ich möchte alle untergeordneten Elemente, aber nur für die aktuellen Eltern. –

+0

Versuchen Sie in der Schleife nach ".//child" zu suchen. Doing "// child" löst offensichtlich eine dokumentenweite Suche aus, wobei von "." Ehrungen Kontext. – Tomalak

Verwandte Themen