我有这个xml文档(并没有我没有编写这个模式)。
<?xml version="1.0" encoding="utf-8" ?>
<rsp stat="ok">
<wmversion>3</wmversion>
<summary day="362" >
<item key="SomeAttribute">
<item key="1">0.33</item>
<item key="10">3.32</item>
<item key="11">0.23</item>
<item key="12">1.06</item>
<item key="13">0.09</item>
<item key="2">0.35</item>
<item key="3">0.72</item>
<item key="4">0.61</item>
<item key="5">1.01</item>
<item key="6">0.10</item>
<item key="7">0.50</item>
<item key="8">1.27</item>
<item key="9">3.01</item>
</item>
...
现在我正在尝试查询此信息,如:
XDocument doc = XDocument.Load(@"C:\Test.xml");
var q = from d in doc.Descendants("summary")
where d.Element("item").Attribute("key").Value == "SomeAttribute"
select new { LengendKey = d.Attribute("key").Value, ElapsedTime = d.Element("item").Value };
我正在返回0项而不是列表。有谁知道我在这里做错了什么?
谢谢,Bill N
答案 0 :(得分:0)
var q = doc.Descendants("summary")
.Where(x => x.Element("item").Attribute("key").Value == "SomeAttribute")
.SelectMany(x => x.Descendants())
.Select( x => new
{ LengendKey = x.Attribute("key").Value, ElapsedTime = x.Value });
这对你有用吗?或者你在寻找其他东西吗?
答案 1 :(得分:0)
我想你要做的事情并不是很清楚。
var q = from d in doc.Descendants("summary")
where d.Element("item").Attribute("key").Value == "SomeAttribute"
select new { LengendKey = d.Attribute("key").Value, ElapsedTime = d.Element("item").Value }
在这里的代码中,d
是'summary'的所有后代,它们本身都有一个带有正确属性的'item'元素。
在您发布的XML中,只有1个“摘要”的后代,并且它没有任何具有正确属性的“item”子项。
我也对行LengendKey = d.Attribute("key").Value, ElapsedTime = d.Element("item").Value
感到困惑 - 这里d
应该是叶子节点(它有密钥1,2,3等) - 这符合语句的第一部分,或者在其下面有'item'元素的父节点 - 它符合语句的第二部分?它不可能同时存在。
你可能想要
// first get the summary; it is a descendant of doc & there's only one.
var summary = doc.Descendants("summary").Single();
// get the element with 'SomeAttribute' from the summary;
// if there's only even going to be one then you can call Single here
var item = summary.Elements().Single(e => e.Name == "item"
&& e.Attribute("key").Value == "SomeAttribute");
var q = item.Elements().Select(e => new
{ LengendKey = e.Attribute("key").Value, ElapsedTime = e.Value });
答案 2 :(得分:-1)
这有效:
var q = doc.Descendants("summary").Descendants("item").Descendants("item")
.Select ( d => new { LengendKey = d.Attribute("key").Value, ElapsedTime = d.Value });