maandag, augustus 28, 2006

.NET XmlDocument is DOM

De MSDN zegt het zelf eigenlijk ook al:
As XML has become popular as a representation format for large sources of information, developers have begun to have problems with editing large XML files. This is especially true for applications that process large log files and need to constantly append information to these files. The most straightforward way to edit an XML file is to load it into an XmlDocument, modify the document in memory and then save it back to disk. However, doing so means that the entire XML document has to be loaded in memory, which may be infeasible depending on the size of the document and the memory requirements of the application.
Gebruiken van XmlDocument is DOM.

RSS en ATOM feeds zijn implementaties van XML. Voor een goede feedreader zul je XML moeten parsen. Echter bij voorkeur niet met het XmlDocument. Die maakt namelijk een DOM aan. In een DOM heeft elk element, attribuut etc zijn eigen objecten. Die objecten moeten aangemaakt worden en in het geheugen gezet worden. En dat kost resources, veel resources. Ooit afgevraagd waarom je feedreader zoveel geheugen vraagt? Waarschijnlijk gebruiken ze een DOM. Mijn perfecte RSS reader gebruikt amper geheugen. Liefst minder dan 5 mb (1 % van de gemiddelde pc dezer dagen) om dat te bereiken gebruik ik geen DOM maar SAX. Oftewel: XmlTextReader. En om het helemaal spannend te maken: XmlValidatingReader met de validating type op none. Voor mij geen schema en geen dtd!


XmlTextReader tr = new XmlTextReader(xmlStream);
XmlValidatingReader myReader = new XmlValidatingReader(tr);
myReader.ValidationType = ValidationType.None;

try
{
while(myReader.Read())
{
string tagName = myReader.Name.ToLower();
if (tagName.Equals("entry"))
{
[...]
}
}
}
catch(Exception ex)
{
[...]
}

(Code is nog lang niet production quality, geen foutafvanging als item verkeerd gaat e.d. maar dat is niet het punt wat ik wil maken. Ik wil alleen maar laten zien hoe makkelijk je met XmlTextReader kunt werken als je het formaat van de binnenkomende XML al weet)

En het resultaat:

Geen opmerkingen: