2010-06-11 27 views
1

我想知道是否有一个健壮和优雅的方式使用linq2xml来查询深层次内的项目。例如:使用linq2xml深入查询单个项目

<?xml version="1.0" encoding="utf-8" ?> 
<data> 
    <core id=""> 
     <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
 XDocument doc = XDocument.Load("file.xml"); 
     var xx = doc.Descendants("id").First().Value; 
+0

哦,来吧!我不敢相信这很简单。现在我感到很蠢。谢谢想知道;-) – BrettRobi 2010-06-11 17:45:42

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"); 
+0

是的,这是我怎么会在过去的都做到了,我想从XPath和成linq2xml因各种原因移开。非常感谢。 – BrettRobi 2010-06-11 17:54:00

1

这会给你一个IEnumerable的所有内容/ ID元素。如果你需要一个特定的环境中,你需要添加条件

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

也是一个优雅的答案。谢谢yetapb。 – BrettRobi 2010-06-11 17:52:59