2014-01-08 3 views
2

Я пытаюсь прочитать некоторые значения конкретных элементов в документе XML, такие как значения < основного > < альфа >, < главный > < бета > < эпсилон > и < основная > <gama> <delta>.C значения # чтения элементов из дерева XML

<?xml version="1.0" ?> 
<main> 
    <alpha>One</alpha> 
    <beta> 
    <delta>DeltaValueFromBeta</delta> 
    <epsilon>EpsilonValueFromBeta</epsilon> 
    <phi>PhiValueFromBeta</phi> 
    </beta> 
    <gamma> 
    <delta>DeltaValueFromGamma</delta> 
    <epsilon>EpsilonValueFromGamma</epsilon> 
    <phi>PhiValueFromGamma</phi> 
    </gamma> 
</main> 

я могу получить значение, используя такой код:

XDocument doc = XDocument.Load("Sample.xml"); 
var quiz = from elements in doc.Elements("main").Elements("beta").Elements("epsilon") 
      select elements; 

foreach (var item in quiz) 
{ 
    string sValue = (string) item.Value; 
    textBox1.AppendText(sValue); 
}   

Есть ли более прямой способ выбора значений элементов мне нужно, без того, чтобы использовать цикл Еогеаспа?

Благодаря Ник

ответ

0

Вы можете сделать это в вашем запросе Linq:

var quiz = (from elements in doc.Elements("main").Elements("beta").Elements("epsilon") 
     select (string)elements).ToList(); 

Это даст вам дорожит list.And можно добавить запись текста без использования Еогеаспа:

StringBuilder sb = new StringBuilder(); 
var values = quiz.Select(x => sb.Append(x)); 
textBox1.AppendText(sb.ToString()); 

Или лучший способ:

var text = doc.Descendants("epsilon") 
       .Select(x => (string)x) 
       .Aggregate((x,y) => x + y); 
textBox1.AppendText(text) 
+0

Использование StringBuilder и AppendText его дубликата. Один из них не нужен. – dovid

+0

Спасибо Selman22. Сначала я попробовал код, который вы написали, и мне показалось, что я вернул неправильный результат (на самом деле это было правильно, но я устал). –

0

Используйте следующие данные, чтобы вы не должны использовать Еогеасп:

IEnumerable<string> values = quiz.Select(x => x.Value); 

Или все в одном:

IEnumerable<string> values = doc.Elements("main").Elements("beta").Elements("epsilon").Select(x => x.Value); 

textBox1.AppendText(values.Aggregate((i, j) => i + j)); 
+0

FirstOrDefault() добавит только один элемент, не многие, не так ли? –

+0

Привет, Сэм, спасибо за ваш ответ. Я получаю ошибку из вашего примера кода «не может неявно Ienumerable to List» –

+0

Список values ​​= doc.Elements («main»). Элементы («бета»). Элементы («epsilon»). Выберите (x => x. Value) .ToList() разрешит ошибку IEnumerable. ПРИМЕЧАНИЕ: вызов .ToList(). Или создайте экземпляр как «IEnumerable values ​​=" вместо этого, и вам не нужен вызов .ToList(). – click2install

2

XPath является еще одним вариантом для прямого доступа к узлу. Эта ссылка может помочь вам. How to get values from an XML file matching XPath query in C#

Редактировать, чтобы добавить в текстовом поле без Еогеаспа, где коллекция результата результата = XPath запроса:

textbox1.AppendText(result.Select(x => x.Value)); 

XPath позволяет динамическому пути здания немного легче, чем запросы LINQ.

+1

+1 Я писал это, когда увидел ваш ответ pop ^^. Вот ссылка [link] (http://www.w3schools.com/xpath/), чтобы начать с запросов XPath. Он не является исчерпывающим и не содержит полной справки, но является хорошим местом для начала. – Sidewinder94

+1

Он попросил оптимизацию цикла for, а не инструкции from. С XPath он все равно получит массив элементов, которые необходимо обработать. –

0
textBox1.AppendText(quiz.Select(x => x.Value).Aggregate((s, s1) => s + s1)); 
+0

Спасибо, что он ушел, это сработало. –

Смежные вопросы