2

サンプル 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>

私はいくつかのチュートリアルを行ってきましたが、files 要素内のすべてのファイルのリストを取得できません。最初の <File> 要素のみが表示され、残りは表示されません。これは私のコードです:

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 を表示するにはどうすればよいですか?

4

4 に答える 4

2

【編集済】

SelectMany()を使用します。

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

SelectMany() は、複数の列挙を 1 つに連結します。

于 2012-09-05T02:19:54.267 に答える
2

Aaron Anodide推奨されるように、ファイルの場所の配列が既にあります。fororforeachループでこの配列を使用します。

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);
}
于 2012-09-05T03:36:16.140 に答える
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
于 2012-09-05T03:08:01.077 に答える
1

次のようなことを行うと、もう少しパフォーマンスが向上する可能性があります。

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

Descendants()ドキュメント内のすべてのノードのコレクションを返します。上記の例では大したことではありませんが、適切な大きさのドキュメントを作成すると、処理が遅くなる可能性があります。代わりに、特にファイルが必要であることがわかっている場合は、 で直接移動するElement()方が速くなります (そして間違いなく読みやすくなります)。

于 2012-09-05T02:33:04.440 に答える