我必须使用Linq编写程序。我只是一名学生,但我还没有学到这一点,所以我有两个问题:
我有一个XML文件,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<Projects>
<Project>
<Information>
<Name>Project1</Name>
<Date>26.01.2015</Date>
</Information>
<Files ID = "S" path = "C:\Users\marcel\Documents">
<file>Test1.txt</file>
<file>Test2.txt</file>
<file>Test3.txt</file>
<file>Test4.txt</file>
<file>Test5.txt</file>
</Files>
<Files ID = "C" path = "C:\Users\marcel\Documents">
<file>Test1(1).txt</file>
<file>Test1(2).txt</file>
<file>Test1(3).txt</file>
<file>Test1(4).txt</file>
<file>Test1(5).txt</file>
</Files>
</Project>
我想得到一个字符串数组,它包含“file”元素的值,取决于ID = S或C. 我在那里有一个以上的项目,所以它首先必须按名称进行搜索,现在正在运行:
var entries = from items in xelement.Elements("Project")
where (string)items.Element("Name").Value == projectName
select items;
让我了解所需项目的整个块。 我可以使用第一个命令的结果来获取文件名吗? 或者我可以扩展第一部分的代码吗?
答案 0 :(得分:1)
要获取具有指定名称的特定Project
元素,您可以使用First
:
var projectElement = xElement
.Elements("Project")
.First(x => (String) x.Element("Information").Element("Name").Value == projectName);
以类似的方式,您可以通过指定ID属性的值来找到所需的Files
元素:
var filesElement = projectElement
.Elements("Files")
.First(x => x.Attribute("ID").Value == id);
然后,您可以使用Select
将File
元素投影到其值并将其转换为数组:
var files = filesElement
.Elements("file")
.Select(x => (String) x.Value)
.ToArray();
请注意,如果XML具有意外格式,则此代码将抛出异常。例如,如果First
找不到匹配的元素,则抛出异常。此外,如果找不到指定的元素,Element
方法将返回null
,因此如果没有x.Element("Information").Element("Name")
元素,则Information
之类的代码会抛出异常,因为下一次调用在Element
引用上执行null
。
答案 1 :(得分:0)
谢谢马丁,那工作:) 我想出了一个像这样的自己的解决方案:
var files = from file in entries.Elements("Files").Elements("file")
where (string)file.Parent.Attribute("ID").Value == cOrS
select file.Value;