So i have an XML document that looks like this:
<?xml version="1.0" encoding="UTF-8"?>
<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref">
<gesmes:subject>Reference rates</gesmes:subject>
<gesmes:Sender>
<gesmes:name>European Central Bank</gesmes:name>
</gesmes:Sender>
<Cube>
<Cube time="2010-05-28">
<Cube currency="USD" rate="1.2384"/>
<Cube currency="JPY" rate="113.06"/>
</Cube>
<Cube time="2010-05-27">
<Cube currency="USD" rate="1.2255"/>
<Cube currency="JPY" rate="110.79"/>
</Cube>
</Cube>
</gesmes:Envelope>
Now suppose that I have an XmlNode timeNode that points to <Cube time="2010-05-28"> node and a document that points to the loaded XML document. Lets say I need to get the value of the rate attribute in the <Cube currency=USD" rate="1.2384"/> node by calling a SelectSingleNode(string xpath) method.
So far I was able to come up with this code:
XmlNamespaceManager nsmgr = new XmlNamespaceManager(document.NameTable);
nsmgr.AddNamespace("ecb", "http://www.ecb.int/vocabulary/2002-08-01/eurofxref");
nsmgr.AddNamespace("gesmes", "http://www.gesmes.org/xml/2002-08-01");
XmlNode currencyNode = timeNode.SelectSingleNode("descendant::ecb:Cube[@ecb:currency='USD']", nsmgr);
string rate = currencyNode.Attributes.GetNamedItem("rate").Value;
The problem here is that currencyNode is set to null here. I’ve checked the timeNode and it points to the correct node, so I guess the problem is with the path in the SelectSingleNode method, yet I fail to see where the problem is. I’ve checked other posts with similar problem but couldn’t find anything that would solve mines. Any pointers will be appreciated.
XML attributes don’t have the a namespace by default, so you don’t need to use the namespace prefix on them. Try just:
You also don’t need to explicitly specify the descendant axis here since it will look at children by default, so you could also shorten it to: