Поиск C # xpath - PullRequest
       24

Поиск C # xpath

0 голосов
/ 10 октября 2011

Я хочу выполнить простой поиск с использованием xpath, это мой XML

enter image description here

и я хочу найти узлы Time и вернуть в результате значение узла Id .

пока это мой код, но я не получаю никаких результатов

XmlNodeList nList = xmlDoc.SelectNodes("//spEvents:Time[. = '" + eventId + "']/parent::node()/spEvents:Times/spEvents:EventTime/spEvents:Time", xmlnsManager);

(обратите внимание, я использую пространства имен)

Спасибо кб

@ Джон, мой код работал нормально с XML для LINQ, как показано ниже

return (from feed in xmlDoc_Spektrix.Descendants("Event")
                              from et in feed.Element("Times").Elements("EventTime")
                              where Convert.ToDateTime(et.Element("Time").Value).ToShortDateString() == Convert.ToDateTime(dt).ToShortDateString()
                select feed.Element("Id").Value).ToList();

но поскольку пространства имен были введены в канал xml, мой код больше не работает, поэтому мне пришлось переключиться на xpath

этот код работал нормально, кто-нибудь знает, почему вышеуказанный код перестает работать с пространствами имен?

Ответы [ 2 ]

3 голосов
/ 10 октября 2011

Правильный ответ на «введение пространства имен сломало мой запрос» - это не «изменить технологию», это «исправить запрос». Это действительно легко с LINQ to XML:

// I'm guessing the namespace *really* has the http part on...
XNamespace ns = "http://system.spektrix.com/api/v1/events";

return (from feed in xmlDoc_Spektrix.Descendants(ns + "Event")
        from et in feed.Element(ns + "Times").Elements(ns + "EventTime")
        where (DateTime) et.Element(ns + "Time") == dt
        select feed.Element(ns + "Id").Value).ToList();

Обратите внимание на упрощенное (и более правильное с учетом культурных изменений) преобразование XElement в DateTime.

0 голосов
/ 24 мая 2016

Исходя из вашего примера, если я правильно понял ваш вопрос, этот XPath может работать. Если вы хотите попробовать XPath, вы можете открыть свой XML в FireFox с помощью плагина FirePath.

//spEvents:Id[./following-sibling::spEvents:Times/spEvents:time[contains(text(),'yourtimetext')]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...