获取xml body的所有元素并添加到struct

时间:2012-05-10 11:25:20

标签: xml coldfusion

我正在寻找一种循环XML-Body的方法,并将每个xml元素传递给一个struct。 我以这种方式访问​​了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的每个元素,如果它不是complexType的话。要以这种方式访问​​复杂元素的子元素:

<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结构中。总是得到结构未定义的错误....

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

2 个答案:

答案 0 :(得分: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被设计为“非平坦” - 是否有特定的要求来展平它?

答案 1 :(得分:0)

这是你在找什么? XmlToStruct on RIAForge