Click here to Skip to main content
15,868,053 members
Articles / Programming Languages / XML
Tip/Trick

NanoXML - Simple and fast XML parser

Rate me:
Please Sign up or sign in to vote.
4.97/5 (10 votes)
13 Nov 2013CPOL2 min read 54.5K   3.1K   19   18
Simple and fast .NET XML parser without using System.Xml

Introduction

This is a quite small and fast XML DOM parser on the .NET platform (using .NET 2.0). The Main feature and main demand for this is not to use the System.Xml namespace. Also tests shows amazing performance results compared with built-in .NET parsers.

Background 

The idea of such a thing was born when one of my friends needed something to parse XML on C# without using the System.Xml namespace. The writing and testing took about three hours. The parser doesn't support the entire XML specification but it is capable of parsing most XML I've tried.

Using the code

Usage of NanoXML is simple. You just need to add NanoXMLParser.cs to your project and use the TObject.Shared namespace. The main top-level class is NanoXMLDocument that parses XML and builds DOM.

NanoXML is not capable of loading data from files, so you may load an XML string with your application itself. Something like this: 

C#
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);

Yes, NanoXML ignores XML declaration's encoding attributeSmile | <img src=  Now, after we have loaded the document, we can get data for any Element or any of its attributes: 

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

NanoXML also ignores comments and DOCTYPE declarations. XML declarations (<?xml ?>) will be parsed and stored in a NanoXMLDocument object. 

Performance

The most amazing thing in this parser is its performance. Before submitting the code here, I tried some benchmarks on the parser and compared it with built-in .NET parsers and I was surprised. All tests were performed on an 1.1 MB SVG file in string (i.e., without disk access overhead). Test results are shown below on the screenshot:

Image 2 

As we can see, NanoXML processes an 1.1 MB file almost immediately (17 ms). XmlDocument loaded document in 11 seconds. XmlReader (a SAX parser which by design should be much faster than DOM) reads the whole document for about 7 seconds. For the XmlReader, the test doesn't do anything but read file content from beginning to end.  Benchmark test sources are available for download. 

Points of Interest 

This parser may be useful because of its great performance or when using built-in parsers (System.Xml namespace) is forbidden.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer Broken Event
Ukraine Ukraine
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
QuestionRelease on Gitlab and Nuget Pin
Omar Piani1-Jun-22 4:51
Omar Piani1-Jun-22 4:51 
QuestionMuch slower in .NET framework 4.7.2 Pin
Chris McElligott Park24-Nov-20 13:28
Chris McElligott Park24-Nov-20 13:28 
QuestionHi Pin
AAB4022-Feb-17 2:54
AAB4022-Feb-17 2:54 
AnswerRe: Hi Pin
BrokenEvent24-Feb-17 7:00
BrokenEvent24-Feb-17 7:00 
GeneralRe: Hi Pin
AAB4027-Feb-17 1:35
AAB4027-Feb-17 1:35 
GeneralRe: Hi Pin
BrokenEvent2-Mar-17 9:00
BrokenEvent2-Mar-17 9:00 
GeneralRe: Hi Pin
AAB402-Mar-17 21:57
AAB402-Mar-17 21:57 
GeneralRe: Hi Pin
BrokenEvent3-Mar-17 6:40
BrokenEvent3-Mar-17 6:40 
GeneralRe: Hi Pin
AAB406-Mar-17 1:17
AAB406-Mar-17 1:17 
SuggestionMore benchmarks would be helpful Pin
E.I.B.14-Feb-17 4:28
E.I.B.14-Feb-17 4:28 
GeneralRe: More benchmarks would be helpful Pin
BrokenEvent19-Feb-17 8:42
BrokenEvent19-Feb-17 8:42 
QuestionSubNode Pin
wfm8-Jun-15 5:44
wfm8-Jun-15 5:44 
AnswerRe: SubNode Pin
wfm8-Jun-15 5:52
wfm8-Jun-15 5:52 
Questionwhere is the code? Pin
Southmountain13-Nov-13 11:29
Southmountain13-Nov-13 11:29 
AnswerRe: where is the code? Pin
BrokenEvent13-Nov-13 11:46
BrokenEvent13-Nov-13 11:46 
GeneralRe: where is the code? Pin
Southmountain13-Nov-13 11:51
Southmountain13-Nov-13 11:51 
GeneralRe: where is the code? Pin
BurntOfferings13-Nov-13 11:56
BurntOfferings13-Nov-13 11:56 
GeneralRe: where is the code? Pin
BrokenEvent13-Nov-13 12:02
BrokenEvent13-Nov-13 12:02 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.