Правильный или неправильный способ поиска в элементе XML с помощью XMLSearch? - PullRequest
6 голосов
/ 12 июня 2009

С учетом следующего XML:

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

Это лучший способ зациклить каждого родителя, а затем извлечь всех детей из этого родителя?

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

Причина, по которой я спрашиваю, заключается в том, что мне никогда не удавалось извлечь все дочерние элементы из текущего элемента XML.

«Это нужно?» Комментарий выделяет строку, которую я добавил, чтобы сделать работу следующей строки. Но возможно ли удалить эту строку и каким-то образом изменить XMLSearch (parent, "// child"), чтобы получать только дочерние элементы из текущего 'parent'?

Спасибо.

1 Ответ

8 голосов
/ 12 июня 2009
<cfset parent = XMLParse(parent)><!--- Is this needed? --->

Нет, это не так. Это даже снижение производительности, потому что вы создаете новый DOM таким образом.

Вы получаете массив узлов XML обратно от XmlSearch() (зачем еще вы используете <cfloop array...?). Это означает, что они должны быть эквивалентны:

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

Чтобы контекст ColdFusion учитывался при поиске узла, вам необходимо:

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

Если вы запускаете выражение XPath с "//", ColdFusion явно ищет весь документ, к которому принадлежит узел, а не только его потомков.

Но если вы заинтересованы в выводе всех <child> элементов из документа, почему бы не сделать это вместо этого:

<cfset children = XMLSearch(xml, "//child")>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...