2013-03-22 2 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

+1

Если вы пытались все утро, предположительно, у вас есть код, который вы уже пробовали. Пожалуйста, включите его в свой вопрос. –

+0

Woops, опечатка при написании этого примера. Изменено. – Roel

ответ

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

+0

@Roel Я исключил избыточность с использованием лямбда и захваченной переменной 'xml' - не бойтесь изменений –

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") 
     };