2012-06-16 32 views
2

由於工作中的一些決定,我最近已經把焦點從VB.NET轉換到C#。 我試圖從XML文件中讀出數據時,現在遇到了一個問題。卡在循環C#中的XML思路#

這一尺,XML看起來像這樣

<?xml version="1.0" encoding="utf-8"?> 
<shipmentdata> 
    <shipment shipmentid="70716481780000102" messageid="2"> 
     <msgcreated>2012-06-14T10:44:00</msgcreated> 
     <orderdate>2012-06-14</orderdate> 
     <services> 
      <baseservice ediid="ZG8">Replenishment</baseservice> 
      <addedservices> 
       <addedservice id="2" ediid="Z47">Installation</addedservice> 
       <addedservice id="3" ediid="Z45">Swap</addedservice> 
      </addedservices> 
     </services> 
     <weight uom="KGM">2</weight> 
     <bulkref>123456</bulkref> 
    </shipment> 
</shipmentdata> 

的C#-code我有是這樣的:

private DataSet ReturnServices(string FileName) 
{ 
    XmlDocument m_xmld = new XmlDocument(); 
    XmlNodeList m_nodelist; 
    m_xmld.Load(FileName); 
    m_nodelist = m_xmld.SelectNodes("/shipmentdata"); 

    DataRow aDR; 
    DataTable aDT = new DataTable("AddedServices"); 
    aDT.Columns.Add("ediid",typeof(string)); 
    aDT.Columns.Add("shipmentid",typeof(string)); 
    DataSet oDS = new DataSet("EDIinfo"); 

    foreach (XmlElement m_node in m_nodelist) 
    { 
     ShipmentID = m_node["shipment"].Attributes. 
      GetNamedItem("shipmentid").Value.ToString(); 

     XmlNodeList s_nodelist = m_xmld.SelectNodes(
      "/shipmentdata/shipment/services/addedservices"); 

     foreach (XmlElement s_node in s_nodelist) 
     { 
      aDR = aDT.NewRow(); 
      aDR["ediid"] = s_node.ChildNodes.Item(0).Attributes. 
       GetNamedItem("ediid").Value.ToString(); 
      aDR["shipmentid"] = ShipmentID; 
      aDT.Rows.Add(aDR); 
     } 
    } 
    oDS.Tables.Add(aDT); 
    return oDS; 
} 

這裏的問題是,雖然該文件包含兩個增值服務(Z47和Z45),但由於某種原因,只有第一個節點存儲在DataTable(Z47)中。我如何去循環所有添加的服務節點?

任何幫助,將不勝感激,我一直堅持這一段時間了,現在開始意識到,我可能陷入了一系列難以擺脫的思想和邏輯。 :P

+0

您到達第一個添加的服務節點,但不是第二個:'aDR [「ediid」] = s_node.ChildNodes.Item(0).Attributes.GetNamedItem(「ediid」)。Value.ToString();'也許你打算爲他們循環? – Filip

+0

感謝您抨擊我,我終於醒來,意識到做DR [「ediid」] = s_node.Attributes.GetNamedItem(「ediid」).Value.ToString();幫助解決了這個問題。 :) – JaggenSWE

+0

添加爲答案 – Filip

回答

2

這個循環

foreach (XmlElement s_node in s_nodelist) 
{ 
     aDR = aDT.NewRow(); 
     aDR["ediid"] = s_node.ChildNodes.Item(0).Attributes. 
      GetNamedItem("ediid").Value.ToString(); 
     aDR["shipmentid"] = ShipmentID; 
     aDT.Rows.Add(aDR); 
    } 

只迭代一次,因爲只有一個由"/shipmentdata/shipment/services/addedservices" XPath語句返回的節點。然後你在這裏得到第一個添加的服務節點aDR["ediid"] = s_node.ChildNodes.Item(0).Attributes. GetNamedItem("ediid").Value.ToString(); ,但從來沒有去第二個。你可能也想循環這些。