2009-06-12 4 views
6

Biorąc pod uwagę następujące XML:Właściwy lub zły sposób wyszukiwania w obrębie elementu XML za pomocą XMLSearch?

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

Jest to najlepszy sposób na pętli na każdym z rodziców, a następnie wyodrębnić wszystkie dzieci z tego rodzica?

<cfset xml = XMLParse(Trim(xml))> 

<cfset parents = XMLSearch(xml, "//parent")> 

<cfloop array="#parents#" index="parent"> 

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

    <cfset children = XMLSearch(parent, "//child")> 

    <cfloop array="#children#" index="child"> 
     <cfoutput>#child.XmlText#</cfoutput> 
    </cfloop> 

</cfloop> 

Powodem, dla którego pytam, jest to, że nigdy nie byłem w stanie wyodrębnić wszystkich elementów potomnych z bieżącego elementu XML.

"Czy to jest potrzebne?" komentarz podświetla linię, którą dodałem, aby linia postępowania działała. Ale czy można usunąć tę linię i jakoś zmienić "XMLSearch (rodzic," dziecko "), aby uzyskać tylko elementy potomne z bieżącego" rodzica "?

Dzięki.

+0

+1 - To jest rzeczywiście rodzaju intuicyjne, że CF nie wydaje się kontekst honorowy w XmlSearch(). – Tomalak

Odpowiedz

8

Nie, nie jest. To nawet kara za wykonanie, ponieważ w ten sposób tworzysz nowy DOM.

Otrzymujesz tablicę węzłów XML z powrotem z XmlSearch() (dlaczego w innym przypadku użyłbyś <cfloop array...?). Oznacza to powinny one być równoważne:

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

Aby kontekst ColdFusion honorową przy szukaniu węzeł, trzeba zrobić:

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

Jeśli zaczniesz wyrażenia XPath z "//", ColdFusion oczywiście przeszukuje cały dokument, do którego należy węzeł, a nie tylko potomkowie tego węzła.

Ale jeśli jesteś zainteresowany wyprowadzania wszystkie<child> elementy z dokumentu, dlaczego tego nie robić zamiast:

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

Tak, rozumiem, ale podczas zapętlenia nad węzłami nadrzędnymi chcę przeszukać w ramach każdego z nich. byłem w stanie wymyślić wersją tej linii ... <= XMLSearch CFSET dzieci (rodzic, „// dziecko”)> ... więc pomyślałem, kolej „rodzic” z Element XML, do dokumentu XML, a następnie XPath jest łatwiejszy. –

+0

Przepraszamy, skomentowaliśmy na podstawie Twojej pierwszej wersji roboczej. Chcę, aby wszystkie elementy podrzędne, ale tylko dla bieżącego rodzica. –

+0

Spróbuj wyszukać ".//child" w pętli. Wykonanie "// child" oczywiście wywoła wyszukiwanie w całym dokumencie, a zaczynając od "." honoruje kontekst. – Tomalak

Powiązane problemy