2

我有一个 xml 文件,我想读取并输出它的数据,我的 xml 如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<serverfiles>
    <file name="picture1.jpg"/>
    <file name="file1.txt"/>
    <folder name="subfolder">
        <file name="picture2.jpg"/>
        <file name="file2.txt"/>
        <folder name="anotherfolder">
            <file name="file3.txt"/>
        </folder>
    </folder>
    <folder name="anotherfolder"/>      
</serverfiles>

并希望这样输出:

picture1.jpg
file1.txt
subfolder\picture2.jpg
subfolder\file2.txt
subfolder\anotherfolder\file3.txt

我试过这个:

  string xml = new WebClient().DownloadString("");
 XmlDocument xdoc = new XmlDocument();
 xdoc.LoadXml(xml);

 XmlElement element = xdoc.DocumentElement;

 XmlAttributeCollection attr_coll = element.Attributes;

 for(int i = 0; i < attr_coll.Count; i++)
 {
     string attr_name = attr_coll[i].Name;
 }

但是在 for 循环计数中,我什么也得不到,有人可以帮助我。

4

3 回答 3

1

你也可以使用 X-path:

        foreach (XmlNode file in xdoc.SelectNodes("//file"))
        {
            string filename = file.Attributes["name"].Value;

            foreach (XmlNode folder in file.SelectNodes("./ancestor::folder"))
            {
                string foldername = folder.Attributes["name"].Value;
                filename = foldername + "\\" + filename;
            }
            System.Diagnostics.Debug.WriteLine(filename);
        }

此代码示例适用于您的 xml。

祝你的任务好运。

于 2013-04-14T17:47:29.140 回答
0

您必须使用递归来获得所需的结果。我认为使用 LINQ to XML 会更容易:

递归函数

public static IEnumerable<string> GetFiles(XElement source, string currentPath = "")
{
    foreach (var file in source.Elements("file"))
    {
        yield return currentPath + (string)file.Attribute("name");
    }
    foreach (var folder in source.Elements("folder"))
    {
        foreach (var file in GetFiles(folder, currentPath + (string)folder.Attribute("name") + "/"))
            yield return file;
    }
}

用法

using System.Xml.Linq;

(...)

var doc = XDocument.Load("Input.txt");
var files = GetFiles(doc.Root).ToList();
于 2013-04-14T17:56:00.620 回答
-1

这个 LINQ to XML 应该可以做到,没有循环,所以效率可能更高一些

    XDocument document = XDocument.Load("c:\\tmp\\test.xml");
    var files = from i in document.Descendants("file")
                where i.Attribute("name") != null
                select new
                    {
                        Filename = (i.Parent != null && i.Parent.Name == "folder" ?
                                        (i.Parent.Parent != null && i.Parent.Parent.Name== "folder" ?
                                        i.Parent.Parent.Attribute("name").Value + @"\" + i.Parent.Attribute("name").Value + @"\" + i.Attribute("name").Value :
                                        i.Parent.Attribute("name").Value + @"\" + i.Attribute("name").Value):
                                        i.Attribute("name").Value)

                    };
于 2013-04-14T18:58:37.857 回答