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

Я пытаюсь выбрать конкретные значения в документе 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));

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

Ответы [ 4 ]

1 голос
/ 02 ноября 2011

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

Используйте

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

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

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

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

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

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

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

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

/*/*/Check[@id = 'adsl']/Provider
1 голос
/ 02 ноября 2011

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

1 голос
/ 02 ноября 2011

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

is: //Linespeed[ancestor::Check[@id = 'adsl']] <- выбирает все узлы Linespeed, чей предок является проверочным элементом с id = adsl </p>

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

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

Выбирает скорость линии, которая является дочерней по отношению к проверке, с @id = 'adsl' в том виде, в каком она стоит в вашем документе.

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

1 голос
/ 02 ноября 2011

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

var elements = XElement.Parse(tmp).Elements("Checks").Elements("Check").Where (xe => xe.Attribute("id").Value=="adsl");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...