Выбор значений из объекта xml-документа с помощью XPATH в коде (c #)

#c# #xml #xpath #sharepoint-2010

#c# #xml #xpath #sharepoint-2010

Вопрос:

Я пытаюсь выбрать определенные значения из XML-документа, используя XPath. XML сохраняется в переменной строки «tmp». Этот xml является результатом запроса, выполняемого через внешний API.

пример содержимого XML:

 <?xml version="1.0" encoding="ISO-8859-1"?>
<Results>
<Checks>
<Check id="wbc">
<Linespeed>6000 </Linespeed>
<Provider>BT WBC </Provider>
</Check>
<Check id="adsl">
<Linespeed>2048 </Linespeed>
<Provider>BT ADSL </Provider>
</Check>
</Checks>
</Results>
  

Используя XPATH в code behind, я хочу иметь возможность выбирать и только для id= adsl, а затем сохранять значение в строковой переменной для последующего использования. Я хочу добиться этого без использования отдельной таблицы стилей xslt.

Вот код, который я написал для этого, но я получаю сообщение об ошибке:

 //Creating an XPATH epression
String strExpression1;
strExpression1 = "Results/Checks/Check[@id = 'adsl']/Linespeed";

//Loading the xml document
XmlDocument doc;
doc = new XmlDocument();
doc.LoadXml(tmp);

//Create an XmlNamespaceManager to resolve the default namespace.
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("bk", "urn:schemas-microsoft-com:xslt");

//Selecting Linespeed from Check id='adsl'
XmlNode Check;
XmlElement root = doc.DocumentElement;
Check = root.SelectSingleNode(strExpression1, nsmgr);

//Assigning the the results of the XPATH expression to the variable Linespeedval
string Linespeedval = Check.ToString();

//Adding a control to display the xpath results of the "tmp" xml objectt
AvailabilityCheckerResults2.Controls.Add(new LiteralControl(Linespeedval));
  

Любая помощь будет с благодарностью оценена! Заранее спасибо!

Комментарии:

1. Я не получаю никаких выходных данных, но вместо этого получаю типичную ошибку sharepoint. Я отладил код, и XML-документ «tmp» считывается, сохраненный в корневом объекте. Похоже, проблема связана с проверкой XmlNode. Ему ничего не присваивается, и еще больше ничего не присваивается строке Linespeedval . Теоретически это должно работать, но есть ли лучший или более простой способ добиться этого? Спасибо

Ответ №1:

 strExpression1 = "/Results/Checks/Check[@id = 'adsl']/Linespeed";
//or strExpression1 = "//Checks/Check[@id = 'adsl']/Linespeed";
//doc has no namespace
Check = root.SelectSingleNode(strExpression1);
....
string Linespeedval = Check.InnerText;
  

Ответ №2:

Взгляните на эту статью . В нем есть пошаговая инструкция по анализу xml с использованием xpath. Как запросить XML с помощью выражения XPath с помощью Visual C #