65.9K
CodeProject 正在变化。 阅读更多。
Home

NanoXML - 简单快速的 XML 解析器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.97/5 (9投票s)

2013年11月13日

CPOL

2分钟阅读

viewsIcon

57311

downloadIcon

3202

简单快速的 .NET XML 解析器,不使用 System.Xml

引言

这是一个在 .NET 平台(使用 .NET 2.0)上相当小巧且快速的 XML DOM 解析器。其主要特性和主要需求是不使用 System.Xml 命名空间。 此外,测试结果显示与内置 .NET 解析器相比,性能非常出色。

背景 

这个想法的诞生源于我的一个朋友需要在 C# 中解析 XML,而无需使用 System.Xml 命名空间。编写和测试大约花费了三个小时。该解析器不支持完整的 XML 规范,但它可以解析我尝试过的大多数 XML。

使用代码

使用 NanoXML 很简单。你只需要将 NanoXMLParser.cs 添加到你的项目中,并使用 TObject.Shared 命名空间。主要的顶级类是 NanoXMLDocument,它解析 XML 并构建 DOM。

NanoXML 无法从文件加载数据,因此你可能需要将 XML 字符串与你的应用程序本身一起加载。例如:

FileStream fs = new FileStream(args[0], FileMode.Open, FileAccess.Read);
byte[] data = new byte[fs.Length];
fs.Read(data, 0, (int) fs.Length);
fs.Close();
 
string strData = Encoding.UTF8.GetString(data);
NanoXMLDocument xml = new NanoXMLDocument(strData);

是的,NanoXML 忽略 XML 声明的编码属性Smile | <img src=  现在,在加载文档后,我们可以获取任何元素或其任何属性的数据:

string myAttribute = xml.RootNode["Subnode"].GetAttribute("myAttribute"); 

NanoXML 还会忽略注释和 DOCTYPE 声明。XML 声明(<?xml ?>)将被解析并存储在 NanoXMLDocument 对象中。

性能

这个解析器最令人惊叹的地方在于它的性能。在提交代码之前,我尝试对解析器进行了一些基准测试,并将其与内置 .NET 解析器进行比较,我感到很惊讶。所有测试均在 1.1 MB SVG 文件中以字符串形式进行(即,没有磁盘访问开销)。测试结果如下所示:

 

正如我们所见,NanoXML 几乎立即处理了 1.1 MB 的文件(17 毫秒)。XmlDocument 加载文档用了 11 秒。XmlReader(一种 SAX 解析器,其设计应该比 DOM 快得多)读取整个文档大约需要 7 秒。对于 XmlReader,测试只是从头到尾读取文件内容。基准测试源代码可供下载。

兴趣点 

由于其出色的性能,或者在使用内置解析器(System.Xml 命名空间)被禁止时,此解析器可能很有用。

© . All rights reserved.