2017-01-31 6 views
0

В настоящее время я работаю над проектом, в котором файл xml должен быть прочитан для параметров программы.Чтение определенного параметра XML

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

<?xml version="1.0" encoding="utf-8"?> 
<!-- Settings for Modul1 --> 
<root> 
<Program-Config> 
    <Parameter>Name</Parameter> 
    <Value>John</Value> 
</Program-Config> 

<Program-Config> 
    <Parameter>Device</Parameter> 
    <Value>TV</Value> 
</Program-Config> 
. 
. 
. 
</root> 

Эта структура также используется для заполнения DataGridView так:

Parameter | Value 
__________|______ 
Name  | John 
Device | TV 

Это работает, и я могу сохранить изменения, внесенные в XML файл.

Однако моя проблема в том, что мне нужно прочитать конкретный элемент XML-файла, и все же он не работает так хорошо.

Мой код:

 string dir; 
     dir = Directory.GetCurrentDirectory() + "\\config.xml"; 

     XDocument xDoc = XDocument.Load(dir); 
     var xmlStr = File.ReadAllText(dir); 

     var str = XElement.Parse(xmlStr); 
     var result = str.Elements("Program-Config"). 
      Where(x => x.Element("Parameter").Value.Equals("Device")).ToList(); 


     for (int i = 0; i <= result.Count - 1; i++) 
     { 
      Console.WriteLine(result[i].Value); 
     } 

Но то, что он пишет в консоли: DeviceTV. Но мне нужно: TV

Это используется как строка/int для других частей программы.

Может ли кто-нибудь помочь мне с этим?

ответ

0

Свойство Value возвращает конкатенированный текст его дочерних узлов. Элемент, возвращаемый result[i], является элементом Parameter, но вы хотите, чтобы его дочерний элемент Value.

var value = (string) str.Elements("Program-Config") 
    .Where(x => (string) x.Element("Parameter") == "Device") 
    .Elements("Value") 
    .Single(); 

Это не понятно, почему вы делаете XDocument.Load и бросали в эту сторону. Вы можете использовать этот документ, слегка настройки вашего запроса:

var value = (string) xDoc.Descendants("Program-Config") 
    .Where(x => (string) x.Element("Parameter") == "Device") 
    .Elements("Value") 
    .Single(); 

См this fiddle для рабочей демонстрации.

+0

Это может быть случай, когда xDocument xDoc = XDocument.Load (dir) является избыточным и оставленным от разного подхода, который я пробовал. – SUM

+0

Я использовал ваше второе решение с xDoc, и оно работает. Чего вы очень! Для меньшего xml-файла это так, как я хочу. Может быть, когда у меня есть больший файл с большим количеством параметров для чтения, мне нужно немного изменить его, поэтому мне не нужно жестко кодировать каждый запрос параметра. – SUM