读取特定的XML参数

时间:2017-01-31 11:32:57

标签: c# xml linq-to-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>

此结构也用于填充数据网格视图,如下所示:

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

但他在Console中写道:DeviceTV。但我需要:电视

然后将其用作字符串/ int,用于程序的其他部分。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分: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