2013-02-20 21 views
3

我有兩個循環,即從兩個XML源獲取數據:有沒有更好的方式來組織這些數據而不是使用字符串數組?

循環1:

foreach (XmlNode nodes in node.ChildNodes) 
      { 
       if (nodes.Name == "DEFAULT") 
        defaults[count] = nodes.InnerText; 
       if (nodes.Name == "TYPE" 
        types[count] = nodes.InnerText; 
       if (nodes.Name == "COL_NAM" 
        names[count] = nodes.InnerText; 

      } 
      count++; 

環2:

foreach (XmlNode nodes in root.ChildNodes) 
     { 
      vals[i] = nodes.InnerText; 
      cols[i] = nodes.Name; 
      i++; 
     } 

不知怎的,我想這個數據組織成一個最終目標。該對象需要有4個部分:名稱,類型,值和默認值。實質上,我想將Loop1中的所有內容,然後Loop2中的所有內容組合在一起,然後將兩個對象組合在一起,將Loop1中的名稱與Loop2中的名稱進行匹配。理想情況下,Loop2中的節點數量可能會少於Loop1中的節點數量。但是,如果這是不可能的,我可以解決它。

爲最終目標的更好的畫面:

object everything = {{names}, {types}, {values}, {defaults}}; 

名稱將來自兩個迴路,並且將是「關鍵」的對象。類型和默認值將來自Loop1,值將來自Loop2。串聯將使用名稱/列進行匹配。

PS:我試圖用二維字符串數組來做到這一點,但當試圖組合兩個匹配cols和names字段時遇到了麻煩。

+1

我不清楚你完成的對象是什麼樣的或者它會包含什麼。如果您可以定義一個具有必要屬性的對象並告訴我們每個屬性將包含什麼,我們可以告訴您如何填充它。 – 2013-02-20 20:52:17

+0

順便說一句,你的第一個循環看起來會產生非常稀疏的數組,因爲你每循環遞增計數。例如,如果第一條記錄上的名稱爲「DEFAULT」,則會填充默認值[0],但類型[0]和名稱[0]都將包含空值。那是你要的嗎? – 2013-02-20 20:54:21

+0

「{names}」,「{types}」,「{values}」和「{defaults}」列表嗎?或者它們是屬於按名稱索引的集合的單個對象的屬性? (As @ Ulises的答案暗示。) – 2013-02-20 20:58:48

回答

5

您可以使用Dictionary類,並使用Name作爲對象的關鍵字。

例如:

public class MyObj{ 
    public string Name{get;set;}; 
    public string Type{get;set;}; 
    public string Value{get;set;}; 
    public string Default{get;set;}; 
} 

並修改循環使用它:

var allObjs = new Dictionary<string, MyObj>(); 


foreach (XmlNode nodes in node.ChildNodes) 
{ 
    var obj = new MyObj(); 
    if (nodes.Name == "DEFAULT") 
     obj.Default = nodes.InnerText; 
    ... 
    allObjs.Add(obj.Name, obj); 
} 

然後在你的第二個循環中使用的關鍵,以更新值擷取現有的對象。像這樣的:

foreach (XmlNode nodes in root.ChildNodes) 
{ 
    var myObj = allObs[nodes.Name]; 
    myObj.Value = nodes.InnerText; 
} 
1

好了,你可以使用XPath來選擇你的價值觀。

public class Ultimate 
{ 
    public Ultimate(XmlNode node) 
    { 
     XmlNode child = node.SelectSingleObject("./COL_NAM"); 
     if (child == null) throw new InvalidArgument("COL_NAM not found"); 
     Name = child.InnerText; 

     XmlNode child = node.SelectSingleObject("./TYPE"); 
     if (child == null) throw new InvalidArgument("TYPE not found"); 
     Type = child.InnerText; 

     XmlNode child = node.SelectSingleObject("./DEFAULT"); 
     if (child == null) throw new InvalidArgument("DEFAULT not found"); 
     Default = child.InnerText; 

     XmlNode child = node.SelectSingleObject("./COL_NAM"); 
     if (child == null) throw new InvalidArgument("COL_NAM not found"); 
     Name = child.InnerText; 

    } 
    public string Name; 
    public string Type; 
    public string Value; 
    public string Default; 
} 

//讀取對象將是這樣的:

Dictionary<string, Ultimate> ultimateCollection = new Dictionary<string, Ultimate>(); 
foreach(XmlNode node in xmlDocument1.SelectNodes("/DATA1")) 
{ 
    Ultimate ultimate = new Ultimate(node); 
    ultimateCollection.Add(ultimate.Name, ultimate); 
} 

foreach(XmlNode node in root.ChildNodes) 
{ 
    Ultimate ultimate; 
    if (ultimateCollection.TryGetValue(node.Name, out ultimate)) 
     ultimate.Values = node.InnerText; 
} 

我希望這將幫助你在你的追求。

相關問題