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