使用c#解析包含多个键值的xml文件

时间:2014-03-11 06:49:52

标签: c# xml c#-4.0 xml-parsing xml-serialization

我有文件格式

<?xml version='1.0' encoding='us-ascii'?>
<root>
  <file id="001">
    <filename>ABC.wav</filename>
    <value>0.18</value>
  </file>
  <file id="002">
    <filename>EFG.wav</filename>
    <value>0.05</value>
    <value>0.14</value>
  </file>
</root>

我想解析使用C#

doc.Load(confidencethresholdFilePath+"\\model.xml");
XmlNodeList nodes = doc.DocumentElement.SelectNodes("/root/file");

List<Result> results = new List<Result>();

foreach (XmlNode node in nodes)
{
    Result result = new Result();
    result.ASfilename= node.SelectSingleNode("filename").InnerText;
    result.resultedSeconds = node.SelectSingleNode("value").InnerText;
    results.Add(result);
}

它给出结果但是错过了第二个记录的第二个值。我怎样才能得到所有结果。

2 个答案:

答案 0 :(得分:1)

如何使用LINQ to XML?

var xDoc = XDocument.Load("Input.xml");

var results =
    xDoc.Root
        .Elements("file")
        .Select(f => new
        {
            FileName = (string)f.Element("filename"),
            Values = f.Elements("value").Select(v => (string)v).ToList()
        })
        .ToList();

results将是一个包含两个属性的匿名类型实例列表:FileName:stringValues:List<string>。您可以轻松地将其更改为返回List<Record>,只需将f => new更改为f => new Record并更新属性信息。

正如您所看到的,使用LINQ to XML获取XML内容比使用旧式XmlSomething类要容易得多。

答案 1 :(得分:0)

如果您想为每个值使用单独的Result并使用非Linq样式,则可以更改初始选择。然后,文件名选择需要适当更改。

doc.Load(confidencethresholdFilePath+"\\model.xml");
XmlNodeList nodes = doc.DocumentElement.SelectNodes("/root/file/value");
List<Result> results = new List<Result>();
foreach (XmlNode node in nodes)
{
    Result result = new Result();
    result.ASfilename= node.SelectSingleNode("../filename").InnerText;
    result.resultedSeconds = node.SelectSingleNode("value").InnerText;
    results.Add(result);
}