2012-03-14 8 views
1

私はColdFusion 8を使用しています。XMLの深い値を効率的にテストして解析する方法は?

私はXMLドキュメントを解析しており、ドキュメントの深いところに埋もれている単一の値を取得する必要があります。私は正常にドキュメントを解析し、必要な値を取得していますが、同じデータを取得するより効率的な方法があるようです。

私は多くのXMLを解析していません。この深いキーの存在を、XMLの解析では非常に典型的なものかどうかをテストする必要があるのですか、何か間違っていますか?これをコード化する良い方法はありますか?

// PARSE THE SOAP RESPONSE 
SoapResponse = xmlParse(httpResponse.fileContent); 
// PUT THE RESPONSE NODES INTO AN ARRAY 
ResponseNodes = xmlSearch(SoapResponse, "//*[ local-name() = 'OnlineBoothInformation' ]"); 

// LOOP THROUGH THE ARRAY AND GET EACH NODE 
for (i = 1; i lte arrayLen(ResponseNodes); i++) { 
    // CREATE NEW STRUCTURE TO HOLD BOOTH DATA 
    BoothInfo = structNew(); 

    // TEST FOR CUSTOM FIELDS TO FIND NEW EXHIBITOR 
    BoothInfo.NewExhibitor = 0; // DEFAULT NEW EXHIBITOR 
    if (structKeyExists(ResponseNodes[i], "CustomFields")) { 
     CustomFields = xmlParse(ResponseNodes[i].CustomFields); 
     for (j = 1; j lte arrayLen(CustomFields); j=j+1) { 
     if (structKeyExists(ResponseNodes[i].CustomFields[j], "Field")) { 
      Field = xmlParse(ResponseNodes[i].CustomFields[j].Field); 
      for (k = 1; k lte arrayLen(Field); k=k+1) { 
      if (ResponseNodes[i].CustomFields[j].Field[k].XmlAttributes.Name == "New Exhibitor") { 
     BoothInfo.NewExhibitor = 1; 
    } 
      } 
     } 
     } 
    } 
    } 

私はBoothInfo構造体に他の値を取得しています。彼らはもっとやりやすくなった。私はこの例にそれらを含めなかった。

UPDATE

私は、コードを書き換えると、私ははるかに効率的に必要なもので取得することができました。

// NEW EXHIBITOR 
BoothInfo.NewExhibitor = 0; 
if (structKeyExists(ResponseNodes[i].CustomFields, "Field")) { 
    Fields = ResponseNodes[i].CustomFields.Field; 
    for (j = 1; j lte arrayLen(Fields); j++) { 
     if (Fields[j].XmlAttributes.Name == "New Exhibitor") { 
      BoothInfo.NewExhibitor = 1; 
    break; 
     } 
} 
} 
+1

'XmlSearch()'を試しましたか? – Henry

+0

「解析している」と誤解していると思います。これは、レキシカルXML文書(角括弧を含む文字列)を一度実行して、メモリ内のデータ構造としてノードのツリーに変換する操作です。パースされると、DOMのようなナビゲーションメソッドを使用してツリー構造を自由にナビゲートしたり、XPathまたはXQueryを使用して宣言的に検索することができます。 –

答えて

2

なぜ、xmlParseを何度も呼び出しているのはわかりません。これを使用して文字列をXMLノードセットに変換しますが、すでにXMLノードセットがあります。

必要なノードに対して、より具体的なXPath仕様を使用できます。たぶん、//*[ local-name() = 'OnlineBoothInformation' ]/CustomFields/Field[@Name="New Exhibitor"]のようなものでしょう。次に、空の配列が返されたかどうかを確認するだけです。 XPathはです。実際にはと表現力がありますが、慣れるまでには時間がかかります。 CFは一般に大文字小文字を区別しませんが、XPathは大文字と小文字を区別します。私はあなたのCFからケースをコピーしましたが、それは動作させるためにXMLのケースに一致していなければなりません。

関連する問題