2012-03-14 43 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 2012-03-14 22:22:50

+0

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

回答

2

嗯,我不明白你爲什麼一遍又一遍調用xmlParse。您使用它將字符串轉換爲XML節點集,但您已經有了一個XML節點集。

您可以針對所需節點使用更具體的XPath規範。也許像,//*[ local-name() = 'OnlineBoothInformation' ]/CustomFields/Field[@Name="New Exhibitor"]。然後你可以檢查一個空數組是否被返回。 XPath是真的富有表現力,但它需要一些習慣。請注意,雖然CF通常不區分大小寫,但XPath是。我從你的CF複製了案例,但它必須與XML中的案例相匹配才能工作。