我有一个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;
}
但是对于循环计数,我没有得到任何东西可以有人请帮助我。
答案 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)
};