2012-05-10 73 views
0

我正在寻找一种方法来遍历XML-Body并将每个xml元素传递到一个结构中。 我得到访问XML主体以这样的方式获取xml正文的所有元素并将其添加到结构中

<cfset var x = arguments.httpRequest /> 
<cfset cont = xmlparse(x) /> 
<cfset var body = xmlsearch(cont, "//SOAP-ENV:Body")[1] /> 
<cfset var args = body.xmlchildren[1].xmlchildren /> 
<cfset xmlElements = {} /> 
<cfset xmlElements["#args[1].xmlName#"] = "#args[1].xmlText#" /> 

这样我就可以得到ARGS中的每个元素,如果它不是一个复杂类型。要访问复杂的元素,我用这样的孩子:

<cfset var children = "" /> 
<cfset children = args[3].xmlchildren /> 
<cfset children = args[1].xmlchildren /> 

XML的第三个要素是这样的:

<Element> 
    <item> 
     <child1>XP_RA_10</child1> 
     <child2>RA-EXPRESS-KATALOG</Wmvtx>  
    </item> 
</Element> 

但我想创建一个方法,并检查是否有任何xmlchildren或不。 我试图这样做的......

<cfif ArrayIsDefined(i.xmlchildren, 1)> 
    <cfset children = args[i].xmlchildren /> 
    <cfif ArrayIsDefined(children[1].xmlchildren, 1)> 
     <!--- if more xmlchildren exist ---> 
    <cfelse> 
     <!if one xmlchildren exist ---> 
    </cfif> 

<cfelse> 
    <!--- if xmlchidren doesn't exist ---> 
</cfif> 

...但我没有得到访问的元素将其插入我创建bevor的结构。总是得到一个错误,结构是未定义的....

是否正确的方法来检查是否有任何子元素?

+1

我之前使用过[jsoup](http://jsoup.org/)来对付XML - 它比XPath更容易,并且遍历结构和数组 - 所以可能值得考虑。 –

+0

伟大的建议彼得......我只是不认为这会给他他似乎正在寻找的结果(一个扁平的结构)。 –

+0

它看起来像jsoup是ja javalibrary,但我用coldfusion编程,并尝试在组件内创建该方法。 –

回答

0

除非你知道提前知道XML对象的结构,你必须测试每个子对象并遍历节点,直到你知道你有一个简单的对象。为了帮助那里是“是”的功能,如:

isObject(var); 
isStruct(var); 
isArray(var); 
isSimpleValue(variable); 

一旦你知道你有一个数组(例如)您遍历它的指数长度为:

<Cfif isArray(children)> 
<cfloop form="1" to="#arraylen(children)#" index="i"> 
     <cfset thisNode = children[i]/> 
     <cfif isStruct(thisNode)? 
     .... do something with the structkeylist. 
     </cfif> 
    <Cfif isArray(thisNode)> 
     .... more looping... 
    </cfif> 
</cfloop> 
</cfif> 

这可能是非常复杂的对象令人畏惧。我很好奇你为什么要这样做? XML被设计为“非平坦” - 是否有一个特定的要求来平整它?

+0

我想将每个简单的项目添加到一个结构,但是,我可以做到这一点必须循环,直到我得到“树”中的最后一项。 xml不一定是平的,但如果树中的任何位置有一个复杂类型,如果一个方法可以为我解决这个问题,而不是编写一个只能在一个文件上使用的特定方法,那将更容易。 .. –

0

这是你在找什么? XmlToStruct on RIAForge

+0

我刚开始构建一个函数,它将通过不同深度的xml进行循环。但是我没有完成它,因为我开始了另一个项目,这对我来说只是一个练习。但是这个项目看起来可以解决我的问题。我想得到我的xml里面的所有东西的输出,这个项目是否在没有子元素的情况下解决这个问题而不会崩溃? –

+0

据我所知,它应该工作。当然,你必须自己测试一下。 – Russ

相关问题