0

我正在寻找一种遍历 XML-Body 并将每个 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>

...但我无法访问元素以将它们插入到我创建的结构中。总是收到结构未定义的错误....

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

4

2 回答 2

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 被设计为“非扁平化”——扁平化它是否有特定要求?

于 2012-05-10T13:31:57.327 回答
0

这是你要找的吗?RIAForge 上的 XmlToStruct

于 2013-05-09T09:32:32.527 回答