以下是示例XML
<?xml version="1.0" encoding="utf-8" ?>
<Instructions>
<Instruction>
<Brand>Brand1</Brand>
<Text>
this is text for Brand1
</Text>
</Instruction>
<Instruction>
<Brand>Brand2</Brand>
<Text>
Brand2 text is slightly different
</Text>
</Instruction>
<Instruction>
<Brand>Brand3</Brand>
<Text>
Brand3 has boring text
</Text>
</Instruction>
<Instruction>
<Brand>Brand4</Brand>
<Text>
Brand4 had long text until the editor got hold of this file
</Text>
</Instruction>
</Instructions>
我的代码是:
string WhoAmI = "Brand1";
string t =
(from Instruction in xmlDoc.Descendants("Instruction")
where (string)Instruction.Element("Brand").Value == WhoAmI
select t = Instruction.Element("Text").Value
).ToString();
//end code
总是
System.Linq.Enumerable + WhereSelectEnumerableIterator`2 [System.Xml.Linq.XElement,System.String]
不是
这是Brand1的文字
我做错了什么?
答案 0 :(得分:2)
LINQ语句返回一系列值,而不是单个值。因此,在序列对象上调用.ToString()
通常不会给你任何特别有用的东西。
在这种情况下,您的语句返回一个序列,其中包含一个值,但仍然是一个序列。所以你需要编写一个只返回一个值的LINQ语句:
string t = (from ... select ...).First();
这里要考虑其他含义,如果序列为空,First()
将抛出异常。 FirstOrDefault()
将返回null。
答案 1 :(得分:0)
尝试将ToString()
替换为FirstOrDefault()
答案 2 :(得分:0)
此查询将返回一系列字符串而不是单个字符串。所以.ToString()方法调用将是IEnumerable ToString方法。
如果您确信查询将始终只返回1个字符串,则可以使用Single()或SingleOrDefault()方法返回字符串。
string WhoAmI = "Brand1";
string t =
(from Instruction in xmlDoc.Descendants("Instruction")
where (string)Instruction.Element("Brand").Value == WhoAmI
select t = Instruction.Element("Text").Value
).SingleOrDefault();
答案 3 :(得分:0)
这将为您提供Text节点包含的文本值的集合。但是,如果缺少Text节点或Brand节点,则此查询将失败。您发布的代码所做的是不接受收集的结果;您正在将返回的集合对象转换为字符串,默认情况下,该字符串仅为您提供对象的名称。
您需要遍历查询返回的列表,以便对返回的多个值执行一些有用的操作...
var results = (from e in doc.Descendants("Instruction")
where e.Descendants("Brand").First().Value == WhoAmI
select e.Descendants("Text").First().Value).ToList();