SelectSingleNode возвращает ноль - PullRequest
       11

SelectSingleNode возвращает ноль

1 голос
/ 01 августа 2010

Итак, у меня есть XML-документ, который выглядит так:

<?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>

Теперь предположим, что у меня есть XmlNode timeNode, который указывает на узел <Cube time="2010-05-28">, и document, который указывает на загруженный документ XML.Допустим, мне нужно получить значение атрибута rate в узле <Cube currency=USD" rate="1.2384"/>, вызвав метод SelectSingleNode(string xpath).

Пока я смог придумать этот код:

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;

Проблема здесь в том, что currencyNode здесь имеет значение null.Я проверил timeNode, и он указывает на правильный узел, поэтому я предполагаю, что проблема в пути в методе SelectSingleNode, но я не вижу, в чем проблема.Я проверил другие сообщения с похожей проблемой, но не смог найти ничего, что решило бы мины.Любые указатели будут оценены.

Ответы [ 2 ]

2 голосов
/ 01 августа 2010

Измените ваш xpath на

descendant::ecb:Cube[@currency="USD"]
1 голос
/ 01 августа 2010

Атрибуты XML по умолчанию не имеют пространства имен, поэтому вам не нужно использовать префикс пространства имен для них.Попробуйте просто:

XmlNode currencyNode = timeNode.SelectSingleNode("descendant::ecb:Cube[@currency='USD']", nsmgr);

Вам также не нужно явно указывать здесь ось-потомок, поскольку она будет смотреть на дочерние элементы по умолчанию, поэтому вы также можете сократить ее до:

XmlNode currencyNode = timeNode.SelectSingleNode("ecb:Cube[@currency='USD']", nsmgr);
...