读取xml什么也不返回

时间:2013-04-14 17:40:17

标签: c# asp.net xml document

我有一个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;
 }

但是对于循环计数,我没有得到任何东西可以有人请帮助我。

3 个答案:

答案 0 :(得分: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。

祝你好运。

答案 1 :(得分: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();

答案 2 :(得分:-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)

                    };