通过从xml-File中选择一个块来获取一个数组

时间:2015-01-27 07:58:39

标签: c# xml linq

我必须使用Linq编写程序。我只是一名学生,但我还没有学到这一点,所以我有两个问题:

  1. 什么是好书/电子书......自学我的下一个问题是什么?
  2. 我有一个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>
    

  3. 我想得到一个字符串数组,它包含“file”元素的值,取决于ID = S或C. 我在那里有一个以上的项目,所以它首先必须按名称进行搜索,现在正在运行:

    var entries = from items in xelement.Elements("Project")
                   where (string)items.Element("Name").Value == projectName
                   select items;
    

    让我了解所需项目的整个块。 我可以使用第一个命令的结果来获取文件名吗? 或者我可以扩展第一部分的代码吗?

2 个答案:

答案 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);

然后,您可以使用SelectFile元素投影到其值并将其转换为数组:

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;