Assume a sample:
You've got an XML-File books.xml as follows:
<books xmlns="urn:books"> <book> <author>It's just me</author> <publisheddate>2009-09-25T09:06</publisheddate> </book> </books>
And now? How to access a node?
First attempt:
XmlDocument doc = new XmlDocument(); doc.Load("books.xml"); // just build xPath for testing StringBuilder xPath = new StringBuilder(); XmlNode someNode = doc.DocumentElement.FirstChild.FirstChild; do { xPath.Insert(0, someNode.LocalName); xPath.Insert(0, "/"); someNode = someNode.ParentNode; } while (someNode != null && someNode.NodeType != XmlNodeType.Document); // xPath == "/books/book/author" XmlNode author = doc.DocumentElement.SelectSingleNode(xPath.ToString());
What is the value of author? Right, it's null, hu.
Next attempt, try using XmlNamespaceManager.
XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable); // try to access with XmlNamespaceManager XmlNode author = doc.DocumentElement.SelectSingleNode(xPath.ToString(), manager);
What is the value of author? Right, it's still null, hu.
And now?
Try to explain: The Namespace and the Prefix of the used namespace is not defined so xpath could not be resolved.
So try this:
XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable); // try to access with XmlNamespaceManager XmlNode author = doc.DocumentElement.SelectSingleNode(xPath.ToString(), manager); So try this: string prefix = "mySample"; if (String.IsNullOrEmpty(manager.LookupPrefix(doc.DocumentElement.NamespaceURI))) { // namespace not added manager.AddNamespace(prefix, doc.DocumentElement.NamespaceURI); } // injecting the namespace xPath.Replace("/", String.Format("/{0}:", prefix)); // xPath is now "/{mySample}:books/{mySample}:book/{mySample}:author" author = doc.DocumentElement.SelectSingleNode(xPath.ToString(), manager);
And now, author sould be the selected node.