Использование linq2xml для запроса одного элемента глубоко внутри - PullRequest
1 голос
/ 11 июня 2010

Мне интересно, есть ли надежный и изящный способ использования linq2xml для запроса элемента глубоко внутри иерархии xml. Например:

<?xml version="1.0" encoding="utf-8" ?>
<data>
    <core id="01234">
        <field1>some data</field1>
        <field2>more data</field2>
        <metadata>
            <response>
              <status code="0">Success</status>
              <content>
                 <job>f1b5c3f8-e6b1-4ae4-905a-a7c5de3f13c6</job>
                 <id>id of the content</id>
              </content>
            </response>
        </metadata>
    </core>
</data>

С этим XML, как мне запросить значение, не используя что-то вроде этого:

var doc = XElement.Load("file.xml");
string id = (string)doc.Element("core")
    .Element("metadata")
    .Element("response")
    .Element("content")
    .Element("id");

Мне не нравится вышеуказанный подход, потому что он подвержен ошибкам (выдает исключение, если в иерархии отсутствует какой-либо тег) и, честно говоря, безобразен. Есть ли более надежный и изящный подход, возможно, с использованием sql-подобного синтаксиса linq?

Ответы [ 3 ]

3 голосов
/ 11 июня 2010
        XDocument doc = XDocument.Load("file.xml");
        var xx = doc.Descendants("id").First().Value;
1 голос
/ 11 июня 2010

Это даст вам IEnumerable со всеми элементами content / id. Если вам нужен один конкретный, вам нужно будет добавить условия

var ids = from content in doc.Descendants("content")
          select content.Element( "id" ).Value;
0 голосов
/ 11 июня 2010

Я бы не использовал linq-to-xml, я бы использовал XML и XPath.Вы можете загрузить XML, а затем использовать запрос XPath, чтобы найти узлы идентификаторов.Как это:

System.Xml.XmlDocument xDoc = new System.Xml.XmlDocument;
xDoc.Load("file.xml");
Xml.XmlNodeList idList = xDoc.SelectNodes("//content/id");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...