2013-06-03 6 views
0

У меня есть XML, где я хочу, чтобы выбрать узел из него здесь является XML:Выбор XML узел с помощью XPath

<?xml version="1.0" encoding="utf-8" ?> 
    <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
    <InResponse xmlns="https://ww.ggg.com"> 
    <InResult>Error </InResult> 
    </InResponse> 
    </soap:Body> 
    </soap:Envelope> 

Я загружая его с помощью XmlDocument «s LoadXML и пытаюсь получить InResult узел, но я получить нуль см ниже, пожалуйста:

xml.SelectSingleNode("//InResult").InnerText; 

ответ

3

у вас есть объявление пространства имен, и вы должны добавить это в ваш XPath или вы можете использовать пространство имен агностик XPath. Попробуйте следующий код в качестве пространства имен агностика решения:

xml.SelectSingleNode("//*[local-name()='InResult']").InnerText; 

Я получил Error в результате

С http://www.w3schools.com/ сайта:

местного именем() - Возвращает имя текущего узла или первый узел в указанном наборе узлов - без префикса пространства имен

Вы можете g et Дополнительная информация о функциях XPath here.

пространство имен известно решение, приводится ниже:

var namespaceManager = new XmlNamespaceManager(x.NameTable); 
namespaceManager.AddNamespace("defaultNS", "https://ww.ggg.com"); 

var result = x.SelectSingleNode("//defaultNS:InResponse", namespaceManager).InnerText; 
Console.WriteLine (result); //prints Error 

Краткие заметки XML:

Эта часть в корневой записке xmlns:soap="http://www.w3.org/2003/05/soap-envelope" является xml namespace декларация. Он используется для идентификации узлов в вашей структуре xml. Как правило, вам нужно указать их для доступа к узлам с ним, но в XPath есть агностические решения пространства имен и в LINQ to XML. Теперь, если вы видите имя узла как <soap:Body>, это означает, что этот узел принадлежит этому пространству имен.

+0

привет, да, это сработало, можете ли вы сказать мне, где пространство имен? это xmlns? – Zaki

+0

@Sam обновил мой ответ –

1

Это, как представляется, проблема пространства имен Вы можете использовать XmlNamespaceManager перед вызовом SelectSingleNode():

XmlNamespaceManager ns = new XmlNamespaceManager(xmldoc.NameTable); 
ns.AddNamespace("ggg", "https://ww.ggg.com"); 
xml.SelectSingleNode("//ggg:InResult", ns).InnerText; 

Внимание: Не тестировалось.

+0

вам следует передать 'ggg' в Xpath, а не' ns'. 'ns' - это имя переменной, и механизм оценки XPath ничего не знает об этом. –

+0

@IlyaIvanov: О да, конечно. Спасибо. –

Смежные вопросы