2014-08-28 19 views
0

У меня проблемы с Xml на моей программе на C#.C# parsing Xml SelectingNode

XML-http://pastebin.com/Ufxaght6 (из песочницы)

Я пытаюсь получить любую информацию о XML, я преуспеваем с помощью рекурсивного цикла на узлах, но я хочу использовать что-то более эффективное.

Я пытаюсь это:

XmlDocument document = new XmlDocument(); 
     document.LoadXml(response); 

     XmlNode node = document.SelectSingleNode("/getnewsalesresult/request/user"); 
     if (node != null) 
      Logger.WriteLine(node.InnerText); 
     else 
      Logger.WriteLine("fail"); 

Это дает всегда нуль. Я думаю, проблема связана с «getnewsalesresult» (например, «Подстановочный знак»).

Из XML:

<getnewsalesresult xmlns="http://www.sandbox.priceminister.com/res/schema/getnewsales" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

XSI: SchemaLocation = "http://www.sandbox.priceminister.com/res/schema/getnewsales http://www.sandbox.priceminister.com/res/schema/getnewsales/getnewsales.2014-02-11.xsd">

Любая идея?

Заранее благодарен.

+0

Я подозреваю, что это проблема с пространством имен. Попробуйте http://stackoverflow.com/questions/1145659/ignore-namespaces-in-linq-to-xml – AaronLS

+0

Я не хочу быть ложкой, но я не знаю, как начать для этого :) –

+0

SelectSingleNode принимает xpath, сначала начните с тестирования только первого уровня: 'document.SelectSingleNode ("/getnewsalesresult ");' если это не возвращает ничего попробовать 'document.SelectSingleNode ("/[local-name() = 'getnewsalesresult'] "); 'или' document.SelectSingleNode ("/ * [local-name() = 'getnewsalesresult']"); ' – AaronLS

ответ

0

Ваш XML имеет пространство имен по умолчанию (xmlns="..."). По умолчанию пространство имен имеет другой характер. Элемент, в котором объявлено пространство имен по умолчанию, и все его потомки без префикса и без другого объявления пространства имен рассматриваются в одном и том же пространстве имен по умолчанию.

Самый простой способ получить элемент в пространстве имен просто игнорировать пространство имен (как и предложено в комментарии к этому вопросу):

string xpath = "/*[local-name()='getnewsalesresult']/*[local-name()='request']/*[local-name()='user']"; 
XmlNode node = document.SelectSingleNode(xpath); 

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

XmlNamespaceManager ns = new XmlNamespaceManager(new NameTable()); 
ns.AddNamespace("d", "http://www.sandbox.priceminister.com/res/schema/getnewsales"); 
XmlNode node = 
     document.SelectSingleNode("/d:getnewsalesresult/d:request/d:user", ns); 

не пропустите передать XmlNamespaceManager объект в качестве 2-го параметра SelectSingleNode().