给出以下
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”)’以仅从当前’父’获取子元素?
谢谢.
<cfset parent = XMLParse(parent)><!--- Is this needed? --->
不,这不对.这甚至是性能损失,因为您以这种方式创建新的DOM.
您从XmlSearch()返回一个XML节点数组(为什么还要使用< 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")>