2013-07-23 27 views
1

我負責從XML POST Response中檢索特定數據。如何在XML POST Response中查找特定數據?

這裏的XML回覆的例子:

<ServiceHistoryArray> 
    <RecordID>XD116067*401529</RecordID> 
    <SWR> 
     <V Idx="1">7932</V><V Idx="2">7932</V><V Idx="3">7932</V><V Idx="4">7932</V> 
    </SWR> 
    <Comments/> 
    <Mileage>6</Mileage> 
    <Operation> 
     <V Idx="1">Z7000*WPDIP****PRE-DELIVERY INSPECTION - BASE TIME</V><V Idx="2">Z911*INC****ETCH WINDOWS</V><V Idx="3">B0048*WPBS4****FASCIA, FRONT BUMPER - REPLACE ONE PIECE</V><V Idx="4">9997*WPBS4****</V> 
    </Operation> 
    <CloseDate>1998-12-30</CloseDate> 
    <OpenDate>1998-10-16</OpenDate> 
    <PartsAmount> 
     <V Idx="1">0.00</V><V Idx="2">0.00</V><V Idx="3">166.32</V><V Idx="4">0.00</V> 
    </PartsAmount> 
    <LaborAmount> 
     <V Idx="1">64.80</V><V Idx="2">3.60</V><V Idx="3">140.40</V> 
    </LaborAmount> 
    <Warranty> 
     <S Idx="1">&#xfc;96&#xfc;0&#xfd;&#xfd;10232632&#xfc;4H&#xfc;1</S><S Idx="2">&#xfc;96&#xfc;0&#xfd;&#xfd;10232632&#xfc;4H&#xfc;1</S><S Idx="3">&#xfc;96&#xfc;0&#xfd;&#xfd;10232632&#xfc;4H&#xfc;1</S> 
    </Warranty> 
</ServiceHistoryArray> 

我需要連接所有相關的「V」元素內的文字。

例:
7392 Z700 * WDIP ****發貨前檢查 - 基本時間0.00 64.80
7392 Z911 * INC **** ETCH WINDOWS 0.00 3.60
等等

這裏的我的代碼迄今:

// String variable to store the XML POST Reply 
    string replyString = WebRequestPostData("http://" + maskedTextBox1.Text + ":" + maskedTextBox2.Text, payload); 


    XmlDocument replyDoc = new XmlDocument(); // New XmlDocument from reply 
    replyDoc.LoadXml(replyString); 
    XmlNodeList list = replyDoc.SelectNodes("//ServiceHistoryArray/*"); // XmlNodeList based on child elements of <ServiceHistoryArray> node. 

    var nodees = new List<XmlNode>(list.Cast<XmlNode>().ToArray()); 

    // Finds Mileage, CloseDate, and OpenDate values and displays them on form. 
    foreach (XmlNode node in nodees) 
    { 
     switch (node.Name) 
     { 
      case "OpenDate": 
       textBox1.Text = node.InnerText; 
       break; 
      case "CloseDate": 
       textBox2.Text = node.InnerText; 
       break; 
      case "Mileage": 
       textBox3.Text = node.InnerText; 
       break; 
     } 
    } 

    // This section is supposed to display the concatenated values of the <V> elements: 
    for (int i = 0; i < nodees.Count; i++) 
    { 
     if (nodees[i].HasChildNodes) 
     { 
      for (int j = 0; j < nodees[i].ChildNodes.Count; j++) 
      { 
       switch (nodees[i].ChildNodes[j].NodeType) 
       { 
        case XmlNodeType.Text: 
         break; 
        case XmlNodeType.Element: 
         switch (nodees[i].ChildNodes[j].Attributes[0].Value) 
         { 

          case "1": 
           Console.WriteLine("1-" + nodees[i].ChildNodes[j].InnerText + " "); 
           break; 
          case "2": 
           Console.WriteLine("2-" + nodees[i].ChildNodes[j].InnerText + " "); 
           break; 
          case "3": 
           Console.WriteLine("3-" + nodees[i].ChildNodes[j].InnerText + " "); 
           break; 
          case "4": 
           Console.WriteLine("4-" + nodees[i].ChildNodes[j].InnerText + " "); 
           break; 
         } 
         break; 
       } 
      } 
     } 
    } 

連接值將需要顯示在ListBox控件。另外,我需要嘗試編寫這個過程,而不是預測一系列的元素;在這種情況下,有4個。POST請求的其他一些實例可能會返回10或2或其他。

我意識到,這可能會或可能不會影響其他用戶,但希望我不是唯一一個在那裏這個問題...

+0

第一次更改:如果可能的話,使用LINQ to XML。這是一個更簡單的XML API。 –

+0

我知道......我一直在這裏看到有關Xml的迴應。我真的需要學習。但是,任何使用「舊」方法的輸入將不勝感激。 – PDXWReX

回答

2

您可以使用LINQ到XML:

XDocument xdoc = XDocument.Parse(replyString); 
var query = from v in xdoc.Descendants("V") 
      group v by (int)v.Attribute("Idx") into g 
      select String.Join(" ", g.Select(x => (string)x)); 

此查詢選擇文檔中的所有V元素,並按Idx屬性值(按順序將元素顯示在文檔中)對它們進行分組。然後,組中元素的所有值都連接成字符串。查詢將包含:

"7932 Z7000*WPDIP****PRE-DELIVERY INSPECTION - BASE TIME 0.00 64.80" 
"7932 Z911*INC****ETCH WINDOWS 0.00 3.60" 
"7932 B0048*WPBS4****FASCIA, FRONT BUMPER - REPLACE ONE PIECE 166.32 140.40" 
"7932 9997*WPBS4**** 0.00" 
+1

+1這真的很優雅,很好。謝謝 –

+0

所以,我從來沒有用過Linq來XML我是這方面的總noob。你能澄清如何查看查詢的內容嗎? ***我正在研究此主題,因爲我輸入此評論... – PDXWReX

+0

感謝您的快速回答!你基本上「強迫」我進入Linq到XML,並且我正在挖掘它!我能夠毫無問題地將查詢內容放入列表框中。再次感謝您的幫助! – PDXWReX

相關問題