2012-09-05 125 views
2

示例XML元素的列表:无法获得使用LINQ to XML

<CONFIGURATION> 
    <Files> 
     <File>D:\Test\TestFolder\TestFolder1\TestFile.txt</File> 
     <File>D:\Test\TestFolder\TestFolder1\TestFile01.txt</File> 
     <File>D:\Test\TestFolder\TestFolder1\TestFile02.txt</File> 
     <File>D:\Test\TestFolder\TestFolder1\TestFile03.txt</File> 
     <File>D:\Test\TestFolder\TestFolder1\TestFile04.txt</File> 
    </Files> 
    <SizeMB>3</SizeMB> 
    <BackupLocation>D:\Log backups\File backups</BackupLocation> 
</CONFIGURATION> 

我一直在做一些教程,但我无法得到的文件元素中的所有文件列表。它仅显示第一个<文件>元素,并不显示其余部分。这是我的代码:

var fileFolders = from file in XDocument.Load(@"D:\Hello\backupconfig1.xml").Descendants("Files") 
         select new 
         { 
          File = file.Element("File").Value 
         }; 

foreach (var fileFolder in fileFolders) 
{ 
    Console.WriteLine("File = " + fileFolder.File); 
} 

如何在Files元素中显示所有文件,SizeMB和BackupLocation?

回答

2

你已经有文件位置的数组,像Aaron Anodide建议你这样做。在forforeach循环使用此阵:

string[] files = configuration.Element("Files").Elements("File").Select(c => c.Value).ToArray(); 
for (int index=0; index<files.Length; index++) 
{ 
    DoSomeStuffWithFileCLocation(files[i]); 
} 

forach(string file in files) 
{ 
    DoSomeStuffWithFileCLocation(file); 
} 
+0

谢谢你的回答!有效!对不起,我的愚蠢的问题.. :) – Blackator

2

将帖子

使用SelectMany()

IEnumerable<string> files = 
    XDocumentLoad(@"D:\Hello\backupconfig1.xml").Descendants("Files") 
     .SelectMany(files => files.Descendants("File")) 
     .Select(file => file.Value) 

的SelectMany()串接多个枚举为一体。

+0

我怎么输出呢?没有选择新的。我如何循环它? – Blackator

+0

@Blackator我已经阐明了上面的例子,以显示如何获取包含文件的字符串列表。 – akton

1

这可能是更好的性能,有点像做以下几点:

XDocument doc = XDocument.Load(@"D:\Hello\backupconfig1.xml"); 
var fileFolders = doc.Root.Element("Files").Elements("File"); 

Descendants()将文档中恢复回来的所有节点的集合。在上面的例子中,这不是什么大问题,但是如果你构造一个合适的大文档,这可能会减慢速度。相反,如果你明确地知道你只是想要文件,那么直接用Element()导航到它会更快(并且可以说更具可读性)。

2
string xml = @"<CONFIGURATION> 
<Files> 
    <File>D:\Test\TestFolder\TestFolder1\TestFile.txt</File> 
    <File>D:\Test\TestFolder\TestFolder1\TestFile01.txt</File> 
    <File>D:\Test\TestFolder\TestFolder1\TestFile02.txt</File> 
    <File>D:\Test\TestFolder\TestFolder1\TestFile03.txt</File> 
    <File>D:\Test\TestFolder\TestFolder1\TestFile04.txt</File> 
</Files> 
<SizeMB>3</SizeMB> 
<BackupLocation>D:\Log backups\File backups</BackupLocation> 
</CONFIGURATION>"; 

var xdoc = XDocument.Parse(xml); 
var configuration = xdoc.Element("CONFIGURATION"); 
string sizeMB = configuration.Element("SizeMB").Value; 
string backupLocation = configuration.Element("BackupLocation").Value; 
string[] files = configuration.Element("Files").Elements("File").Select(c => c.Value).ToArray(); 

Console.WriteLine(sizeMB); 
Console.WriteLine(backupLocation);  
Console.WriteLine(string.Join("\r\n", files)); 

输出

3 
D:\Log backups\File backups 
D:\Test\TestFolder\TestFolder1\TestFile.txt 
D:\Test\TestFolder\TestFolder1\TestFile01.txt 
D:\Test\TestFolder\TestFolder1\TestFile02.txt 
D:\Test\TestFolder\TestFolder1\TestFile03.txt 
D:\Test\TestFolder\TestFolder1\TestFile04.txt 
+0

谢谢!你的答案有效!然而,我需要加载一个xml,并将元素放在for循环中,因为我将对每个文件位置进行一些操作。这是我第一次使用Linq,我仍然需要研究代码并创建一个for循环出来了。 – Blackator

+0

顺便说一下,\ r和\ n在string.Join中加入了什么? – Blackator