SelectSingleNode returns null when tag contains xmlNamespace
You should use an XmlNamespaceManager in your call to SelectSingleNode():
XmlNamespaceManager ns = new XmlNamespaceManager(xmldoc.NameTable);
ns.AddNamespace("msbld", "http://schemas.microsoft.com/developer/msbuild/2003");
XmlNode node = xmldoc.SelectSingleNode("//msbld:Compile", ns);
SelectSingleNode returns null even with namespace managing
Your XML has default namespace which descendant elements without prefix implicitly inherits from the ancestor. That implies, not only the root element but all elements mentioned in your XPath are in the same default namespace, hence need to be referenced by using the same prefix :
//CIP4NS:Command/CIP4NS:ResourceCmdParams/CIP4NS:InkZoneProfile/CIP4NS:InkZoneProfile/CIP4NS:InkZoneProfile/CIP4NS:InkZoneProfile
C# SelectSingleNode returns null
- your XML path is wrong:
g
is not a child ofsodipodi:namedview
. They are siblings. - the XPath is malformed: remove the trailing ']' character
- you have defined a default namespace by declaring
xmlns="http://www.w3.org/2000/svg"
(no alias/prefix) on thesvg
element, but you are not qualifying the child types of the declaring node using the default namespace. According to XML namespace rules, the default namespace is "inherited" to all child elements of the parent that defines the namespace (svg
in this case). The default namespace of an element defines an implicit prefix, that implicitly applies to all child elements..
To be able to qualify your elements using the default namespace, you first must register it
xmlnsManager.AddNamespace("default", "http://www.w3.org/2000/svg");
where default
is a random alias to map the default namespace.
After registering the default namespace, modify the XPath to qualify child types of svg
using the alias.
The fixed XPath would look as followed:
XmlNode node = document.DocumentElement.SelectSingleNode("default:g/default:image", xmlnsManager);
Alternatively remove the default namespace declaration xmlns="http://www.w3.org/2000/svg"
from the svg
element.
C# Xml SelectSingleNode returns null
Just use XmlNamespaceManager
XmlNamespaceManager namespaces = new XmlNamespaceManager(xdoc.NameTable);
namespaces.AddNamespace("sp", "http://www.webserviceX.NET");
var nodes = xdoc.DocumentElement.SelectSingleNode("//sp:NewDataSet/sp:Table[1]/sp:Country", namespaces);
Xmldoc .selectsinglenode returns null
Don't forget to use Xml namespaces
XmlNamespaceManager nsMgr = new XmlNamespaceManager(xDoc.NameTable);
nsMgr.AddNamespace("x", "http://usop.ctadvantage.com/");
XmlNode targetNode = xDoc.SelectSingleNode("/x:SOPDetail/x:TargetInfo/x:DomesticJurisdiction", nsMgr);
SelectSingleNode returns a null value
The Powershell syntax for NameTable handling is pretty similar to C#. After loading the data, create a NamespaceManager based on the XML document.
To select elements, a dummy namespace prefix needs to be used, in this sample x
is added and used in Xpath. Like so,
[xml]$xml = Get-Content MyXml.xml
$nsmgr = new-object Xml.XmlNamespaceManager($xml.NameTable)
$nsmgr.AddNameSpace("x", "http://microsoft.com/GroupPolicy/GPOOperations/MigrationTable")
$xml.MigrationTable.Mapping[1].SelectSingleNode("x:DestinationSameAsSource", $nsmgr)
Null return on XmlDocument.SelectSingleNode through valid xpath
You have introduced default namespace here :
xmlns="http://www.origostandards.com/schema/ce/v2.1/CEBondSingleContractDetailResponse"
which causes message
element and all of it's descendants without prefix to be recognized as in that default namespace (unless the descendant element has local default namespace). To access element in default namespace, simply register a prefix, for example d
, and map it to the default namespace uri :
nsmgr.AddNamespace("d", "http://www.origostandards.com/schema/ce/v2.1/CEBondSingleContractDetailResponse");
Then use the newly registered prefix accordingly in the XPath expression :
XmlNode xnBody = xmlDoc.SelectSingleNode("//soapenv:Envelope/soapenv:Body", nsmgr);
XmlNode xnMessage = xnBody.SelectSingleNode("d:message", nsmgr);
SelectSingleNode always returns null?
You're missing the XML namespace defined by the <message>
node in your SelectSingleNode
call. Assuming oss
is an XmlDocument
instance, you need to do this:
XmlNamespaceManager nsMgr = new XmlNamespaceManager(oss.NameTable);
nsMgr.AddNamespace("ns", "http://www.mydomain.com/MyDataFeed");
XmlNode errorNode = oss.SelectSingleNode("/ns:message/ns:error", nsMgr);
Marc
Why is SelectSingleNode returning null?
I cannot replicate this using an XML file
<MT>
<Events>
<event id="1">
<field name="blah" value="a_value" type="atype" />
</event>
</Events>
</MT>
And code
XmlDocument doc = new XmlDocument();
doc.Load(@"C:\test.xml");
XmlNode node = doc.SelectSingleNode("//event[@id='1']");
This returns a non-null node as expected.
Update
After adding a xmlns="example.org"
to the <MT>
element, I had to configure a namespace manager for the XPath and use the namespace for the event. Couldn't get the default namespace to work for some reason.
XmlDocument doc = new XmlDocument();
doc.Load(@"D:\test.xml");
XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable);
manager.AddNamespace("e", "http://example.org");
XmlNode node = doc.SelectSingleNode("//e:event[@id='1']", manager);
One thing confused me when trying to get this to work. Why does XmlNamespaceManager need XmlNameTable from the document if not for finding out what namespaces it contains? As in, why do I need to define the NameTable and the namespace? I'd appreciate if someone who knows could drop a short comment.
Related Topics
Creating Application Shortcut in a Directory
Send a File via Http Post with C#
How to Move Mouse Cursor Using C#
How to Set Custom JSONserializersettings for JSON.Net in ASP.NET Web API
Allow Windows Service to Interact with Desktop
Can't Get Czech Characters While Generating a PDF
Accessing a Variable from Another Script C#
#If Debug VS. Conditional("Debug")
"The Remote Certificate Is Invalid According to the Validation Procedure." Using Gmail Smtp Server
Differencebetween 'Protected' and 'Protected Internal'
C# Reflection: How to Get Class Reference from String
Difference Between Invariantculture and Ordinal String Comparison
How to Send Sms Through C# Code Using System.Io.Ports Using Gsm Modem