我正在使用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 2012-03-14 22:22:50
我認爲你誤解了「解析」是什麼。這是一個在詞法XML文檔(包含尖括號的字符串)上執行一次操作,將其轉換爲內存中的數據結構的節點樹。一旦解析完畢,就可以使用類似DOM的導航方法自由導航樹結構,或者您可以使用XPath或XQuery以聲明方式搜索它。 – 2012-03-15 07:51:32