2011-11-12 21 views
1

XMLからキーと値のペアを取得して、Webサイトのメンバー情報を入力する必要があります。 XMLのサンプルは次のとおりです。ColdfusionでXMLから名前/値のペアを抽出する

<a:PObject xmlns:b="http://schemas.datacontract.org"> 
<b:CanUpsert>true</b:CanUpsert> 
<b:Fields xmlns:c="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
    <c:KeyValueOfstringanyType> 
     <c:Key>FirstName</c:Key> 
     <c:Value i:type="d:long" xmlns:d="http://www.w3.org/2001/XMLSchema">Joe</c:Value> 
    </c:KeyValueOfstringanyType> 
    <c:KeyValueOfstringanyType> 
     <c:Key>LastName</c:Key> 
     <c:Value i:type="d:long" xmlns:d="http://www.w3.org/2001/XMLSchema">Mama</c:Value> 
    </c:KeyValueOfstringanyType> 
</b:Fields> 
</a:PObject> 

私はXMLには新しく、接頭辞には苦労しています。私はキー/値のペアの配列を私に与えるために以下を使用しています:

インデックスで必要なデータを参照することができます。これはほとんどの場合うまく機能しますが、何らかの理由ですべてのレコードが同じ場所にデータを持っているわけではありません。つまり、#keyValue [4]#はレコードの95%で動作しますが、ほんのわずかで、私に全く異なる値を与えます!

私はこの件についてこの記事と他の場所で多くの記事を読んでいます。それらのどれも接頭辞の問題の周りに私を得ることはありません。たとえば、要素を名前でアクセスするには、

<cfset firstNameKey = XmlSearch(soapBody,"//*[ text() = 'FirstName' ]") /> 

を使用しますが、どのように対応する値が得られますか?私は兄弟姉妹を使ってみましたが、正しくしてはいけません...私も接頭辞のすべてを取り除くことを試みました - 何もないそれから働きました!

あなたに私が与えることができるアドバイスや提案があれば、あらかじめありがとうございます。私が言ったように、私はXMLに慣れていません(それはCFでも先進的ではありません)。正しい方向を指し示すことを楽しみにしています。どうもありがとう!

答えて

1

私はxpathより簡単な手段を提案します - XML文字列をxmlparse()を使ってオブジェクトに変換し、必要な要素を反復処理し、cfコードを使って名前と値のペアを構築します。 XMLオブジェクトをCfdumpして、結果の構造がどのようになっているかを確認します。これはかなり簡単です。試してみます。

編集

このビットに働いた後、私はあなたのためにいくつかの作業コードがあります。

<cfsavecontent variable="xmldata"> 
<PObject xmlns:b="http://schemas.datacontract.org"> 
<b:CanUpsert>true</b:CanUpsert> 
<b:Fields xmlns:c="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
    <c:KeyValueOfstringanyType> 
     <c:Key>FirstName</c:Key> 
     <c:Value type="d:long" xmlns:d="http://www.w3.org/2001/XMLSchema">Joe</c:Value> 
    </c:KeyValueOfstringanyType> 
    <c:KeyValueOfstringanyType> 
     <c:Key>LastName</c:Key> 
     <c:Value type="d:long" xmlns:d="http://www.w3.org/2001/XMLSchema">Mama</c:Value> 
    </c:KeyValueOfstringanyType> 
</b:Fields> 
</PObject> 
</cfsavecontent> 

<cfset xmlObj = xmlParse(xmldata)> 
<cfset valueArray = xmlSearch(xmlObj,"//*[local-name()='KeyValueOfstringanyType']")> 
<cfset nameValuePairs = {}> 
<cfloop from="1" to="#ArrayLen(valueArray)#" index="i"> 
     <cfset name = xmlSearch(valueArray[i], "c:Key")[1].xmlText> 
     <cfset value = xmlSearch(valueArray[i], "c:Value")[1].xmlText> 
     <cfset nameValuePairs[name] = value> 
</cfloop> 
<cfdump var="#nameValuePairs#"> 

注意を、いくつかの参照にはあったので、私は、少しあなたのXMLサンプルを変更する必要がありました定義されていない名前空間。とにかく - 上記は私のために働く。

+0

こんにちはジェイク、返信いただきありがとうございます!私は今それをやっているのだろうか?私は接続しているAPIからXMLを取得して戻ってきて、のように解析します。私が "soapBody"をcfdumpすると、大きなフォーマットのXML表現が得られます。名前空間を取り除いてcfdumpすると、XML形式ではなく、タグ付きの巨大な文字列が得られます。私はあなたの提案に取り組んでみましょう、私が思い付くものを見てみましょう。 Jakeさん、ありがとう! – daltec

+0

まだ同じ問題に直面しています。私はファーストネームに、そのテキスト値 "First Name"を参照してアクセスできます。しかし、私はその値が何であるかわからないので、 Joeにアクセスする方法を見ていません。そして、私が続ける必要があるのはです。私は今それに取り組んでいますが、あなたに戻ってくるでしょう。ありがとうジェイク! – daltec

+0

こんにちはジェイク、どうもありがとうございました。私は実際にはかなり似たアプローチを打ちましたが、私はcfifタグを使います。あなたの方がはるかに効率的です。助けてくれてありがとう!ほんとうにありがとう。 – daltec

関連する問題