XPath queries without namespace: XSE to the rescue

Note: this entry has moved.

Dare has posted about issues with XPath and namespaces in documents. I'm by no means encouraging this, but if you don't care about namespaces, here's a solution for you.

Using the XSE reader I proposed (and will upload real soon see the release post), you can setup a handler to catch all elements and remove any namespaces whatsoever, at reading time (i.e. long before the document is loaded), as follows:

public class MyLoader { public XPathDocument Load(string uri) { TransformingXseReader xr = new TransformingXseReader(new XmlTextReader(uri)); XmlNamespaceManager mgr = new XmlNamespaceManager(xr.NameTable); xr.AddHandler(new RelativePath().Create("*", mgr), new EventHandler(OnElement)); XPathDocument doc = new XPathDocument(xr); return doc; } private void OnElement(object sender, EventArgs e) { TransformingXseReader tr = (TransformingXseReader) sender; tr.ChangeName(tr.LocalName, String.Empty); } }

The Whidbey version looks more compact:

public class MyLoader { public XPathDocument Load(string uri) { TransformingXseReader xr = new TransformingXseReader(new XmlTextReader(uri)); XmlNamespaceManager mgr = new XmlNamespaceManager(xr.NameTable); xr.AddHandler(new RelativePath().Create("*", mgr), delegate { xr.ChangeName(xr.LocalName, String.Empty); } XPathDocument doc = new XPathDocument(xr); return doc; } }

What you effectively get loaded is an infoset without element namespaces, therefore your XPath queries don't need to care about them anymore.

Update: read these follow-up:

No Comments