C#操作XML(六)
上集介绍了使用XmlWriter如何写一个大型的xml,不难发现XmlWriter使用起来略比Linq to Xml麻烦一些,不过优势却是基本不消耗内存。不过XmlWriter的功能仅仅是写Xml,要读取Xml则需要依靠XmlReader,这就是今天的主角。、
二、准备工作
首先,准备一个大型的Xml:
private static void CreateLargeXmlFile(string fileName) { using (var writer = XmlWriter.Create(fileName, new XmlWriterSettings { Indent = true })) { writer.WriteStartDocument(); writer.WriteStartElement("root"); for (int i = 0; i < 100; i++) { writer.WriteStartElement("folder"); writer.WriteAttributeString("name", i.ToString()); for (int j = 0; j < 100; j++) { writer.WriteStartElement("folder"); writer.WriteAttributeString("name", j.ToString()); for (int k = 0; k < 1000; k++) { writer.WriteStartElement("file"); writer.WriteAttributeString("name", k.ToString()); writer.WriteEndElement(); } writer.WriteEndElement(); } writer.WriteEndElement(); } writer.WriteFullEndElement(); writer.WriteEndDocument(); } }
执行这个方法,就可以获得一个250M的大型Xml。
三、使用XmlReader读取Xml
1. 基础
using (var reader = XmlReader.Create("test.xml")) { while (reader.ReadToFollowing("file")) { var name = reader.GetAttribute("name"); if (name.EndsWith("0")) { Console.WriteLine(name); } } }
这段代码将打印出Xml中所有file节点,并且name是以"0"位结尾的name属性。
2. 升级版
XmlReader还有不少的方法,不过这样使用,实在是太累了。对于大多数的操作而言,Linq to Xml的API已经足够强大,所以不妨依葫芦画瓢,来一个简易版的Linq to XmlReader。
a. 扩展方法
public static class ElementsExtension { public static IEnumerable<XmlReader> Elements(this XmlReader reader, string name) { reader.Read(); while (reader.ReadToNextSibling(name)) { var result = reader.ReadSubtree(); result.Read(); yield return result; result.Close(); } } }
使用扩展方法:
private static void ReadByReader() { using (var reader = XmlReader.Create("test.xml")) { foreach (var item in from x in reader.Elements("root").First().Elements("folder") let parentName = x.GetAttribute("name") where int.Parse(parentName) % 20 == 0 from y in x.Elements("folder") let folderName = y.GetAttribute("name") where int.Parse(folderName) % 30 == 0 select string.Format("folder:{0}\tfolder:{1}", parentName, folderName)) { Console.WriteLine(item); } } }
结果:
folder:0 folder:0
folder:0 folder:30
folder:0 folder:60
folder:0 folder:90
folder:20 folder:0
folder:20 folder:30
folder:20 folder:60
folder:20 folder:90
folder:40 folder:0
folder:40 folder:30
folder:40 folder:60
folder:40 folder:90
folder:60 folder:0
folder:60 folder:30
folder:60 folder:60
folder:60 folder:90
folder:80 folder:0
folder:80 folder:30
folder:80 folder:60
folder:80 folder:90
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/70817.html