One of my coworkers was struggling with an XML document with a default namespace, none of his attempts returned any nodes. The main reason for this was that his document contained a default namespace which he didn’t include in the query.
As a reminder here a sample how to query an XML document with a default namespace.
Sample XML document:
<?xml version="1.0" encoding="utf-8" ?> <root xmlns="urn:paulvanbrenk.com/2008/06"> <book> <author>C. Sells</author> <title>Programming WPF</title> </book> <book> <author>C. Petzold</author> <title>Application = Code + Markup</title> </book> <book> <author>C. Anderson</author> <title>Essential WPF</title> </book> </root>
This doesn’t work:
// load sample document XmlDocument doc = new XmlDocument(); doc.Load("../../sample.xml"); // try query without namespace var node1 = doc.SelectNodes("/root/book/title"); Console.WriteLine("node1.Count == 0 {0}", node1.Count == 0);
If you add an XmlNamespaceManager the call to select nodes is able to resolve the nodes:
// load sample document XmlDocument doc = new XmlDocument(); doc.Load("../../sample.xml"); // add namespace manager XmlNamespaceManager xnManager = new XmlNamespaceManager(doc.NameTable); xnManager.AddNamespace(/* prefix */ "x", /* uri */ @"urn:paulvanbrenk.com/2008/06"); var node2 = doc.SelectNodes("/x:root/x:book/x:title", xnManager); Console.WriteLine("node2.Count != 0 {0}", node2.Count != 0);
And using XLinq makes it a little more readable:
XDocument xDoc = XDocument.Load("../../sample.xml"); XNamespace x = "urn:paulvanbrenk.com/2008/06"; var node3 = from item in xDoc.Elements(x + "root").Elements(x + "book") select item.Element(x + "title"); Console.WriteLine("node3.Count() != 0 {0}", node3.Count() != 0);
Note how you query the nodes by combining the XNameSpace and the node name.
sample: sample.zip (2.6 KB)