我在同一个晚上的第二篇文章,道歉!
我有一个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个空行。任何人都可以指出我正确的方向,我做错了吗?
非常感谢。
答案 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);
您还需要进行以下其他更改:
dataFromXML
可能包含多个元素,您需要使用循环或索引来访问它们。fileName
和其他变量作为dataFromXML
变量的成员。它们没有自己的局部变量,这就是为什么你收到你提到的错误信息。string
,因为默认情况下从XML属性读取的值已经是字符串。