使用linq2xml查询内部的单个项目

时间:2010-06-11 17:17:52

标签: linq-to-xml

我想知道是否有一种强大而优雅的方式使用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");

我不喜欢上述方法,因为它容易出错(如果层次结构中缺少任何标记,则抛出异常)并且说实话很难看。是否有更强大和更优雅的方法,也许使用linq的类似SQL的语法?

3 个答案:

答案 0 :(得分:3)

        XDocument doc = XDocument.Load("file.xml");
        var xx = doc.Descendants("id").First().Value;

答案 1 :(得分:1)

这将为您提供包含所有content / id元素的IEnumerable。如果您需要一个特定的,您需要添加条件

var ids = from content in doc.Descendants("content")
          select content.Element( "id" ).Value;

答案 2 :(得分:0)

我不会使用linq-to-xml,我会使用XML和XPath。您可以加载XML然后使用XPath查询来查找ID节点。像这样:

System.Xml.XmlDocument xDoc = new System.Xml.XmlDocument;
xDoc.Load("file.xml");
Xml.XmlNodeList idList = xDoc.SelectNodes("//content/id");