1

我在同一天晚上的第二个帖子,道歉!

我有一个 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 文件中找到匹配的条目,然后检索该条目的所有其他属性。例如,用户已将 Adob​​e Acrobat X Professional 添加到第二个列表框。该方法应该查看 XML 文件,找到与列表中的内容匹配的属性“名称”的条目,并写入其他数据(路径、类型、开关)或将它们设置为字符串的值。到目前为止,经过多次调整,我取得的成就很少。我设法得到了一些非常乱码的输出。

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

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 中查找该值等于“名称”值的位置,然后在找到时将该值的其他属性设置为这些字符串(路径为 filePath,类型为 fileType 等)。最后,我试图将这些字符串写入文本文件。通过这种特殊的尝试,我得到的只是 5 个空白行。谁能指出我做错了什么的正确方向?

非常感谢。

4

1 回答 1

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。它们自己没有局部变量,所以这就是你收到你提到的错误消息的原因。
  • 您不需要转换为 a string,因为默认情况下从 XML 属性读取的值已经是字符串。
于 2013-02-15T23:26:08.913 回答