使用LINQ to XML从XML文件中检索多个属性,将每个属性写入行

时间:2013-02-15 23:15:52

标签: c# linq-to-xml

我在同一个晚上的第二篇文章,道歉!

我有一个XML文件,其中包含各种软件条目的几个信息(下面的代码段)。

<software>
    <software_entry
    name="Adobe Acrobat X Standard"
    path="Applications\Acrobat\Acrobat X Standard\AcroStan.msi"
    type="msi"
    switches="/qn ALLUSERS=1"
    />
    <software_entry
    name="Adobe Acrobat X Professional"
    path="Applications\Acrobat\Acrobat X Pro\AcroPro.msi"
    type="msi"
    switches="/qn ALLUSERS=1"
    />
</software>

我正在使用LINQ to XML来加载XML文件。在我的应用程序中,我有两个列表框,其中第一个(listBox1)填充了此XML文件中每个条目的名称。然后,用户可以将这些条目从一个列表框移动到另一个列表框(listBox2)。

我正在尝试编写一个迭代listBox2中每个条目的方法,找到XML文件中的匹配条目,然后检索该条目的所有其他属性。例如,用户已将Adobe Acrobat X Professional添加到第二个列表框中。该方法应查看XML文件,找到具有与列表中的内容匹配的属性“name”的条目,并写入其他数据(路径,类型,开关)或将它们设置为字符串的值。到目前为止,经过多次调整后,我的成就很少。我设法得到了一些非常混乱的输出。

到目前为止我的代码如下。

private void writeBatchFile()
{
    // Get temp folder location
    string tempPath = Path.GetTempPath();

    // Create batch file
    using (StreamWriter writer = File.CreateText(tempPath + @"\swInstaller.cmd"))
    {
        // Loop through entries in listBox2
        foreach (string item in listBox2.Items)
        {
            var dataFromXML = from data in document.Descendants("software_entry")
                               where data.Element("name").Value == item
                               select new
                               {
                                   fileName = (string) data.Element("name"),
                                   filePath = (string) data.Element("path"),
                                   fileType = (string) data.Element("type"),
                                   fileSwitches = (string) data.Element("switches")
                               };

            // Write to batch file
            writer.WriteLine(fileName + filePath + fileType + fileSwitches);
        }
    }
}

在代码中,我为listBox2中的文本值设置了一个foreach循环。然后,我试图找到该值等于XML中“name”值的位置,然后当它执行时,将该值的其他属性设置为这些字符串(filePath表示路径,fileType表示类型等)。最后,我正在尝试将这些字符串写入文本文件。通过这个特殊的尝试,我得到的只是5个空行。任何人都可以指出我正确的方向,我做错了吗?

非常感谢。

1 个答案:

答案 0 :(得分:2)

您正在尝试读取XML属性,而不是元素。请改用Attribute方法:

var dataFromXML = Enumerable.Single
(
    from data in document.Descendants("software_entry")
    where data.Attribute("name").Value == item
    select new
    {
        fileName = data.Attribute("name").Value,
        filePath = data.Attribute("path").Value,
        fileType = data.Attribute("type").Value,
        fileSwitches = data.Attribute("switches").Value
    }
);

writer.WriteLine(dataFromXML.fileName);

您还需要进行以下其他更改:

  • 使用Enumerable.Single()表示您只希望1个元素与给定名称匹配。否则dataFromXML可能包含多个元素,您需要使用循环或索引来访问它们。
  • 您需要访问fileName和其他变量作为dataFromXML变量的成员。它们没有自己的局部变量,这就是为什么你收到你提到的错误信息。
  • 您不需要转换为string,因为默认情况下从XML属性读取的值已经是字符串。