当前位置:首页 > Windows程序 > 正文

C#操作XML(六)

2021-05-25 Windows程序

  上集介绍了使用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