Как использовать XPath с XElement или LINQ?

Рассмотрим следующий XML:

 200 OK  http://bit.ly/b47LVi b47LVi 9EJa3m http://www.tumblr.com/docs/en/api#api_write 0   

Я ищу очень короткий способ получить только значение элемента . Я пытался:

 var hash = xml.Element("hash").Value; 

Но это не работает. Возможно ли предоставить запрос XPath для XElement ? Я могу сделать это со старой системой System.Xml , делая что-то вроде:

 xml.Node("/response/data/hash").Value 

Есть ли что-то подобное в пространстве имен LINQ?


ОБНОВИТЬ:

После обезьяны с этим еще немного я нашел способ сделать то, что я пытаюсь сделать:

 var hash = xml.Descendants("hash").FirstOrDefault().Value; 

Мне все равно было бы интересно узнать, есть ли у кого-то лучшее решение?

Чтобы использовать XPath с LINQ to XML, добавьте объявление using для System.Xml.XPath , это приведет к расширению методов System.Xml.XPath.Extensions в область.

В вашем примере:

 var value = (string)xml.XPathEvaluate("/response/data/hash"); 

Другие полностью разумно предложили использовать «родные» запросы LINQ to XML, чтобы делать то, что вы хотите.

Однако в интересах предоставления множества альтернатив рассмотрите XPathSelectElement , XPathSelectElements и XPathEvaluate для оценки выражений XPath против XNode (все они являются методами расширения на XNode ). Вы также можете использовать CreateNavigator для создания XPathNavigator для XNode .

Лично я большой поклонник непосредственного использования LINQ to XML API, так как я большой поклонник LINQ, но если вам удобнее XPath, это может помочь вам.

См., Имея дело с LINQ to XML, почему вы не используете LINQ для получения фактического объекта.

Потомки находят каждый элемент из всего XML и перечисляют все объекты, соответствующие указанному имени. Итак, в вашем случае hash – это имя, которое оно находит.

Таким образом, вместо того, чтобы делать

 var hash = xml.Descendants("hash").FirstOrDefault().Value; 

Я бы развалился, как:

 var elements = xml.Descendants("hash"); var hash = elements.FirstOrDefault(); if(hash != null) hash.Value // as hash can be null when default. 

Таким образом, вы также можете получить атрибуты, элементы узлов и т. Д.

Проверьте эту статью, чтобы получить четкое представление об этом, чтобы это помогло. http://www.codeproject.com/KB/linq/LINQtoXML.aspx Надеюсь, это поможет вам.

Вы можете использовать метод .Element (), чтобы связать элементы, чтобы сформировать структуру, похожую на XPath.

Для вашего примера:

 XElement xml = XElement.Parse(@"...your xml..."); XElement hash = xml.Element("data").Element("hash"); 

Я попытался придумать структуру LINQesq для генерации xpath. Он позволяет вам описывать xpath, используя выражения c # lambda

 var xpath = CreateXpath.Where(e => e.TargetElementName == "td" && e.Parent.Name == "tr"); var xpath = CreateXpath.Where(e => e.TargetElementName == "td").Select(e => e.Text); 

Не уверен, что это полезно в этом контексте, но вы можете найти документацию здесь:

http://www.syntaxsuccess.com/viewarticle/how-to-create-xpath-using-linq

  • XPath - получить узел без дочернего элемента определенного типа
  • XPath: выберите текстовый узел
  • XPath: разница между точкой и текстом ()
  • Как использовать XPath в документах xml, имеющих пространство имен по умолчанию
  • XPath выбирает все элементы между двумя конкретными элементами
  • Текущий узел или узел контекста в XSLT / XPath?
  • Получить XPath для XElement?
  • Использование функций xpath в верхнем и нижнем регистре в среде IDE seleniumа
  • Извлечение значения узла атрибута через XPath
  • XPath для выбора элемента по значению атрибута
  • Как вы найдете все узлы между двумя H3, используя XPATH?
  • Interesting Posts

    Решить круговую зависимость typedef?

    Android TextView Обоснование текста

    Есть ли простой способ получить все экземпляры объектов определенного classа в Java

    Несколько файлов dex определяют Landroid / support / v4 / accessibilityservice / AccessibilityServiceInfoCompat

    Сжать большой CSV-фильтр? (500MB)

    Как я могу сделать мой настольный ПК более спокойным и спокойным?

    Неподдерживаемая версия major.minor 52.0 в моем приложении

    Linux SOCKS5 туннелирование не работает с udp-трафиком

    Как обрабатывать заблокированный буфер обмена и другие странности

    Win 8.1 Высокое использование RAM без использования выгружаемого пула

    Как проверить адрес электронной почты?

    Как создать исполняемый файл .exe из файла .m

    Обновление текстового документа MS из двух других документов

    Как настроить виртуальный сервер с помощью статического ip?

    Способ избежать тайм-аута соединения ssh и замораживания терминала GNOME

    Давайте будем гением компьютера.