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