从XML文件中检索数据

Chr*_*non 5 .net c# xml

我似乎在使用C#检索XML值时遇到问题,我知道这是因为我对C#和.XML的知识非常有限.

我得到了以下XML文件

<PowerBuilderRunTimes>
    <PowerBuilderRunTime>
        <Version>12</Version>
        <Files>
            <File>EasySoap110.dll</File>
            <File>exPat110.dll</File>
            <File>pbacc110.dll</File>
        </File>
     </PowerBuilderRunTime>
</PowerBuilderRunTimes>
Run Code Online (Sandbox Code Playgroud)

我将处理XML文件,并确保文件夹中存在的每个文件(这是简单的部分).这是我难以处理的XML文件的处理.这是我到目前为止所做的:

var runtimeXml = File.ReadAllText(string.Format("{0}\\{1}", configPath, Resource.PBRuntimes));

var doc = XDocument.Parse(runtimeXml);
var topElement = doc.Element("PowerBuilderRunTimes");
var elements = topElement.Elements("PowerBuilderRunTime");

foreach (XElement section in elements)
{
    //pbVersion is grabbed earlier. It is the version of PowerBuilder
    if( section.Element("Version").Value.Equals(string.Format("{0}", pbVersion ) ) )
    {
        var files = section.Elements("Files");

        var fileList = new List<string>();

        foreach (XElement area in files)
        {
            fileList.Add(area.Element("File").Value);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是字符串列表只填充了一个值"EasySoap110.dll",其他一切都被忽略了.有人可以帮助我,因为我不知所措.

Jon*_*eet 10

看看这一点:

var files = section.Elements("Files");

var fileList = new List<string>();

foreach (XElement area in files)
{
    fileList.Add(area.Element("File").Value);
}
Run Code Online (Sandbox Code Playgroud)

您将迭代每个Files元素,然后查找其中的第一个File元素.只有一个Files元素 - 您需要迭代其中的File元素.

但是,肯定有更好的方法可以做到这一点.例如:

var doc = XDocument.Load(Path.Combine(configPath, Resource.PBRuntimes));
var fileList = (from runtime in doc.Root.Elements("PowerBuilderRunTime")
                where (int) runtime.Element("Version") == pbVersion
                from file in runtime.Element("Files").Elements("File")
                select file.Value)
               .ToList();
Run Code Online (Sandbox Code Playgroud)

请注意,如果有多个匹配PowerBuilderRunTime的元素,这将创建一个列表所有的文件,所有这些元素.这可能不是你想要的.例如,您可能需要:

var doc = XDocument.Load(Path.Combine(configPath, Resource.PBRuntimes));
var runtime = doc.Root
                 .Elements("PowerBuilderRunTime")
                 .Where(r => (int) r.Element("Version") == pbVersion)
                 .Single();

var fileList = runtime.Element("Files")
                      .Elements("File")
                      .Select(x => x.Value)
                      .ToList();
Run Code Online (Sandbox Code Playgroud)

这将验证只有一个匹配的运行时.