2016-04-19 4 views
0

В моем коде i итерации через xelement и вернуть значение каждого узла внутри этого элемента, например.Xelement дважды добавляет значение элемента

foreach(XElement n in XDocument.Descedants("element_name) 
{ 
    Console.WriteLine("Searching: " n.Value); 
} 

Моя проблема заключается в обе <Directory> элементы возвращаются в строке

Searching: C:\Users\215358\OneDrive\MusicC:\Users\215358\Dropbox\Music 

Мой файл XML выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?> 
<Directories> 
    <Directory>C:\Users\215358\OneDrive\Music</Directory> 
    <Directory>C:\Users\215358\Dropbox\Music</Directory> 
</Directories> 

Я ожидаю, что это для вывода второй строки элемента в <Directory> следующим образом:

C:\Users\215358\Dropbox\Music 

Почему это происходит?

+1

Как выглядит ваш 'xml'? также объясните, какой результат ожидается. –

+0

Что вы ищете? или вы просто хотите взять последний элемент? –

+0

Я хочу искать по всем элементам по одному за раз –

ответ

2

XElement.Value получает concatenated text contents of an element. Это включает в себя текст дочерних элементов, который не всегда очень полезен. Если вам просто нужен текст из текущего элемента, вы можете найти текстовый узел в своих дочерних узлах.

foreach(XElement n in XDocument.Descedants("Directory")) 
{ 
    var text = n.Nodes().Where (x => x is XText).Cast<XText>().FirstOrDefault(); 
    if(text!=null){ 
     Console.WriteLine("Searching: " + text.Value); 
    }else{ 
     Console.WriteLine("No text node found"); 
    } 
} 
+0

Это работает, но он выводит только первый каталог в файле. Я хочу, чтобы он дал мне все каталоги один за другим. EDIT: Я читал это неправильно. Оно работает! спасибо –

0

Поскольку вы хотите перебирать каждую позицию и значение элемента поиска, вы можете сделать что-то вроде этого.

foreach (var element in doc.Descendants("Directory")) 
{ 
    if((string)element.Value == "searchstring") 
    { 
      // your logic 
    } 
} 

В случае, если вы ищете второй элемент в xml, вы могли бы применить Skip расширения пропустить заданное количество элементов.

var secondelement = doc.Descendants("Directory").Skip(1); // Skip first element; 

или если вы ищете последний элемент, вы могли бы принять Last или LastOrDefault расширение.

var lastelement = doc.Descendants("Directory").LastOrDefault(); 

Проверьте это example.