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

そのため、complexType でない場合は、args の各要素を取得できます。複雑な要素の子にアクセスするには、次のように使用しました。

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

3 番目の要素の 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オブジェクトの構造を知っていない限り、各子オブジェクトをテストし、単純なオブジェクトがあることがわかるまでノードをトラバースする必要があります。次のような「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は「非フラット」になるように設計されています-それをフラット化するための特定の要件はありますか?

于 2012-05-10T13:31:57.327 に答える
0

これはあなたが探していたものですか?RIAForge の XmlToStruct

于 2013-05-09T09:32:32.527 に答える