Использование XPATH для выбора определенных значений из XML-документа?

#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 в коде, я хочу иметь возможность выбирать <Linespeed> и <Provider> только для id=adsl , а затем сохранять значение в строковой переменной для последующего использования. Я хочу добиться этого без использования отдельной таблицы стилей xslt. Любая помощь в этом будет высоко оценена!

Заранее спасибо

Спасибо всем за помощь, используя выражение xpath, которое я теперь хочу использовать следующим образом:

 //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 string variable Linespeedval
string Linespeedval = Check.ToString();

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

Теоретически я должен иметь возможность видеть значение, отображаемое на странице внутри заполнителя с именем «AvailabilityCheckerResults2», но вместо этого я получаю сообщение об ошибке. Есть ли способ присвоить результаты из выражения xpath строковой переменной? Еще раз спасибо

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

1. Что вы пробовали?

Ответ №1:

Выражение xpath для выбора <Linespeed/> и <Provider/> для <Check id="adsl"/>

is : //Linespeed[ancestor::Check[@id = 'adsl']] <— Это выбирает все узлы Linespeed, предком которых является элемент check с id = adsl

В качестве альтернативы вы могли бы использовать что-то вроде :

 /Results/Checks/Check[@id = 'adsl']/Linespeed 
  

При этом выбирается скорость строки, которая является дочерней для проверки с помощью @id = ‘adsl’, как это указано в вашем документе.

Для поставщика вы можете использовать ту же методологию.

Ответ №2:

Попробуйте /Results/Checks/Check[@id='adsl']/Linespeed или /Results/Checks/Check[@id='adsl']/Provider (что вы хотите выбрать, вы пропустили это?)

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

1. Спасибо, я добавил дополнительный код для включения этого выражения xpath, но вместо желаемого результата я получаю ошибку. Есть ли более простой способ сделать это? Спасибо

Ответ №3:

Попробуйте это в качестве отправной точки.

 var elements = XElement.Parse(tmp).Elements("Checks").Elements("Check").Where (xe => xe.Attribute("id").Value=="adsl");
  

Ответ №4:

Я хочу иметь возможность выбирать <Linespeed> и <Provider> только для id = adsl

Использовать:

 /*/*/Check[@id = 'adsl']/*[self::Linespeed or self::Provider]
  

При этом выбирается любой Linespeed Provider элемент or, который является дочерним элементом a Check , строковое значение id атрибута которого "adsl" равно, и который является внучатым дочерним элементом верхнего элемента XML-документа.

Если гарантируется, что a Check может иметь только Linespeed Provider дочерние элементы или, то вышесказанное можно упростить до:

 /*/*/Check[@id = 'adsl']/*
  

При этом выбирается любой элемент, который является дочерним элементом a Check , строковое значение id атрибута которого "adsl" равно, и который является внучатым дочерним элементом верхнего элемента XML-документа.

Если вы хотите выбрать только Linespeed элемент, используйте:

 /*/*/Check[@id = 'adsl']/Linespeed
  

Если вы хотите выбрать только Provider элемент, используйте:

 /*/*/Check[@id = 'adsl']/Provider