2013-03-22 47 views
0

我一直在嘗試整個上午,我似乎無法得到這個工作。 我有一個XML文件,如下所示:XML記錄到C#中的數組

<?xml version="1.0" encoding="utf-8" ?> 
<Details> 
    <cityItems> 
    <city>Amsterdam</city> 
    <city>New York</city> 
    </cityItems> 
    <streetItems> 
    <street>Mainstreet</street> 
    <street>Secondstreet</street> 
    </streetItems> 
</Details> 

我試圖得到輸出有點像這樣;

string[] cities = { "Amsterdam", "New York" }; 
string[] streets = { "Mainstreet", "Secondstreet" }; 

街道和城市之間沒有任何關聯。 我似乎無法找到正確的例子在互聯網上得到這個工作。

您能否幫助我或指點我正確的方向?謝謝。

+1

你的xml不是很好的開始。嘗試關閉'' – DGibbs 2013-03-22 11:07:21

+1

如果你一直在嘗試整個上午,大概你已經有一些你已經嘗試過的代碼。請把它包含在你的問題中。 – 2013-03-22 11:08:01

+0

Woops,寫這個例子時會出現錯字。改變了它。 – Roel 2013-03-22 11:08:07

回答

2

我XML改變了你,使其具有正確的收盤點</cityItems>

var xml = XDocument.Parse(str); 

Func<string, string[]> readAllCities = 
          nodeName => 
            xml.Descendants(nodeName) 
             .SelectMany(node => node.Elements("city") 
                   .Select(v => v.Value)) 
             .ToArray(); 


string[] streets = readAllCities("streetItems"); 
string[] cities = readAllCities("cityItems"); 

我將離開老版本的代碼複製,這樣就可以選擇什麼是更好的和整合更舒適到您的解決方案

string[] cities = xml.Descendants("cityItems") 
        .SelectMany(node => node.Elements("city") 
              .Select(v => v.Value)) 
        .ToArray(); 


string[] strets = xml.Descendants("streetItems") 
        .SelectMany(node => node.Elements("city") 
              .Select(v => v.Value)) 
        .ToArray(); 
+0

這就像一個魅力。我錯誤地接近了我的問題。萬分感謝。 – Roel 2013-03-22 11:12:21

+0

@Roel我已經消除了使用lambda的冗餘並捕獲了'xml'變量 - 不要害怕改變 – 2013-03-22 11:15:00

0

您需要使用LINQ to XML我猜測並將結果循環到數組。這裏有一些東西可以指向你正確的方向

XDocument xdoc = XDocument.Load("data.xml"); 

    //Run query 
    var lv1s = from lv1 in xdoc.Descendants("level1") 
     select new { 
      Header = lv1.Attribute("name").Value, 
      Children = lv1.Descendants("level2") 
     };