获取xml正文的所有元素并添加到结构

获取xml正文的所有元素并添加到结构,xml,coldfusion,Xml,Coldfusion,我正在寻找一种通过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

我正在寻找一种通过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#" />
<cfset var children = "" />
<cfset children = args[3].xmlchildren />
<cfset children = args[1].xmlchildren />

因此,如果args的每个元素不是complexType,我可以得到它。要访问复杂元素的子元素,我使用以下方法:

<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#" />
<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>

XP_RA_10
RA-EXPRESS-KATALOG
但是我想创建一个方法来检查是否有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结构中。总是收到结构未定义的错误

这是检查是否有子元素的正确方法吗?

除非您提前知道XML对象的结构,否则您必须测试每个子对象并遍历节点,直到知道您有一个简单的对象为止。要提供帮助,有如下中的“is”功能:

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,它比XPath和遍历结构和数组容易得多,所以可能值得考虑。。。我只是不认为这会给他带来他想要的结果(一个平面结构)。看起来jsoup是ja javalibrary,但我正在使用coldfusion编程,并尝试在组件内创建该方法。我想将每个简单项添加到结构中,但在执行此操作之前,必须循环,直到得到“树”中的最后一项. xml不必是平面的,但是如果树中的任何地方都有一个复杂类型,那么如果有一个方法可以为我解决这个问题,而不是编写一个只可在一个文件上使用的特定类型,那就更容易了……我刚开始构建一个函数,该函数将循环遍历不同深度的xml。但我没有完成它,因为我开始了另一个项目,这只是我的一个练习。但是这个项目看起来可以解决我的问题。我想得到xml中所有内容的输出,当没有子元素时,这个项目能解决这个问题而不崩溃吗?据我所知,它应该可以工作。当然,你得自己测试一下。