http://stackoverflow.com/questions/585812/using-xpath-with-default-namespace-in-c
Question
:
I've got an XML document with a default namespace. I'm using a XPathNavigator to select a set of nodes using Xpath as follows:
XmlElement
myXML
=
...;
XPathNavigator
navigator
=
myXML
.
CreateNavigator
();
XPathNodeIterator
result
=
navigator
.
Select
(
"/outerelement/innerelement"
);
I am not getting any results back: I'm assuming this is because I am not specifying the namespace. How can I include the namespace in my select?
Solution
:
2
down vote
|
In case the namespaces differ for outerelement and innerelemen
|
XmlNamespaceManager
manager
=
new
XmlNamespaceManager
(
myXmlDocument
.
NameTable
);
manager
.
AddNamespace
(
"o"
,
"namespaceforOuterElement"
);
manager
.
AddNamespace
(
"i"
,
"namespaceforInnerElement"
);
string
xpath
=
@
"/o:outerelement/i:innerelement"
// For single node value selection
XPathExpression
xPathExpression
=
navigator
.
Compile
(
xpath
);
string
reportID
=
myXmlDocument
.
SelectSingleNode
(
xPathExpression
.
Expression
,
manager
).
InnerText
;
// For multiple node selection
XmlNodeList
myNodeList
=
myXmlDocument
.
SelectNodes
(
xpath
,
manager
);
Microsoft sample:
Dim
reader As
New
XmlTextReader("myfile.xml"
)
Dim
nsmanager As
New
XmlNamespaceManager(reader.NameTable)
nsmanager.AddNamespace("msbooks"
, "www.microsoft.com/books"
)
nsmanager.PushScope()
nsmanager.AddNamespace("msstore"
, "www.microsoft.com/store"
)
While
reader.Read()
Console.WriteLine("Reader Prefix:{0}"
, reader.Prefix)
Console.WriteLine("XmlNamespaceManager Prefix:{0}"
,
nsmanager.LookupPrefix(nsmanager.NameTable.Get
(reader.NamespaceURI)))
End
While