Tuesday, February 2, 2010

Traverse an XML Document Produce a namespacemanager


using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;

namespace xpath
{
class XmlTraverser
{
private XmlDocument doc;
private XmlNamespaceManager nmgr;
public XmlNamespaceManager getXmlNamespaceManager(){
return nmgr;
}
public XmlTraverser(XmlDocument doc)
{
this.doc = doc;
XmlNode node = doc.DocumentElement;
nmgr = new XmlNamespaceManager(doc.NameTable);


traverseDocument(node, "", nmgr);
ShowAllNamespaces(nmgr);


}

private void traverseDocument(XmlNode node, string path, XmlNamespaceManager nmgr)
{
path += "/" + node.Name;


if (node.HasChildNodes)
{
foreach (XmlAttribute att in node.Attributes)
{

if (att.Name.StartsWith("xmlns"))
{
string[] splitString = att.Name.Split(new Char[] { ':' });
nmgr.AddNamespace(splitString[1], att.InnerText);


}
Console.WriteLine(att.Name + " == " + att.InnerText);
}


foreach (XmlNode childNode in node.ChildNodes)
{
if (!childNode.HasChildNodes)
{




Console.WriteLine(path + " = "+childNode.InnerText);
}
traverseDocument(childNode, path, nmgr);
}
}

}
private void ShowAllNamespaces(XmlNamespaceManager nsmgr)
{
do
{
Console.WriteLine("popedScope");
foreach (String prefix in nsmgr)
{
Console.WriteLine("Prefix={0}, Namespace={1}", prefix, nsmgr.LookupNamespace(prefix));
}
}
while (nsmgr.PopScope());
}

}
}
Usage
static void Main(string[] args)
{
XmlDocument doc = new XmlDocument();
doc.Load(@"c:\Data\adrian\adrian.xml");
XmlTraverser xmlTraverser = new XmlTraverser(doc);
XmlNamespaceManager mgr = xmlTraverser.getXmlNamespaceManager();
XmlNodeList nodes = doc.SelectNodes("/ns5:dataItemInstance[ns6:id/ns6:id=16100 and ns6:id/ns6:version=1]/ns5:relatedDIT/ns7:id/text()", mgr);
foreach (XmlNode node in nodes)
{
Console.WriteLine("Got here");
Console.WriteLine(node.InnerText);
}
Console.Read();

}

No comments: