我使用下面的查询返回所有子元素,然后根据我想要获取结果的子节点。
XElement rootElement = XElement.Load(@"E:\Samples\TestConsole\TestConsoleApp\TestConsoleApp\XMLFile1.xml");
IEnumerable<XElement> lv1s = from lv1 in rootElement.Descendants("A")
where lv1.Attribute("Code").Value.Equals("A001") && lv1.Attribute("Lable").Value.Equals("A001")
select (from ltd in lv1.Descendants("A1")
where ltd.Attribute("Code").Value.Equals("001")
select ltd.Elements()).ToList();
但我仍然有以下错误。
Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<System.Collections.Generic.List<System.Collections.Generic.IEnumerable<System.Xml.Linq.XElement>>>' to 'System.Collections.Generic.IEnumerable<System.Xml.Linq.XElement>'. An explicit conversion exists (are you missing a cast?)
请告诉我。
我想要我的lv1s [“A11”],lv1s [“A22”]
的价值 下面的是我的xml
<?xml version="1.0" encoding="utf-8" ?>
<Document>
<A Code="A001" Lable="A001">
<A1 Code="001">
<A11>A1</A11>
<A22>A2</A22>
<A33>A3</A33>
</A1>
</A>
<A Code="A002" Label="A002">
<A1 Code="002">
<A44>A44</A44>
<A55>A55</A55>
</A1>
</A>
</Document>
请告诉我。
另外我如何处理“枚举产生无结果”作为我的返回列表中的计数0,因为如果发生此错误,它会给出计数> 0。
答案 0 :(得分:3)
查询结果的类型为IEnumerable<List<IEnumerable<XElement>>>
。但您正尝试将其分配给IEnumerable<XElement>
。为什么?因为对于每个A
元素,您要选择A1
子元素的列表。这会为您提供列表集合。
您可以使用显式结果类型来解决此问题。即而不是IEnumerable<XElement> lv1s
使用var lvls
。或者使用实际的lvls类型:IEnumerable<List<IEnumerable<XElement>>> lvls
。
或者,如果您想获得IEnumerable<XElement>
,请使用SelectMany
:
IEnumerable<XElement> lv1s =
rootElement.Descendants("A")
.Where(lv1 => (string)lv1.Attribute("Code") == "A001" &&
(string)lv1.Attribute("Lable") == "A001")
.SelectMany(lv1 => lv1.Descendants("A1")
.Where(ltd => (string)ltd.Attribute("Code") == "001")
.Select(ltd => ltd.Elements());
或者以这种方式重写您的查询:
IEnumerable<XElement> lv1s =
from lv1 in rootElement.Descendants("A")
where (string)lv1.Attribute("Code") == "A001" &&
(string)lv1.Attribute("Lable") == "A001"
from ltd in lv1.Descendants("A1")
where (string)ltd.Attribute("Code") == "001"
from e in ltd.Elements()
select e;
返回以下元素:
<A11>A1</A11>
<A22>A2</A22>
<A33>A3</A33>
答案 1 :(得分:1)
建议:不要使用.Value
,而是投放为string
。另外,如果您的变量在任何情况下都是IEnumerable<XElement>
而不是List<XElement>
,那么为什么需要ToList
?
XElement rootElement = XElement.Load(@"E:\Samples\TestConsole\TestConsoleApp\TestConsoleApp\XMLFile1.xml");
IEnumerable<XElement> lv1s =
from lv1 in rootElement.Descendants("A")
where (string)lv1.Attribute("Code") == "A001" && (string)lv1.Attribute("Lable") == "A001"
select (
from ltd in lv1.Descendants("A1")
where (string)ltd.Attribute("Code") == "001"
select ltd.Elements()
);
您有一个嵌套的LINQ查询,并且您的查询也返回IEnumerable<XElement>
。尝试删除嵌套查询,并返回单个元素作为查询的结果(仅为了清楚起见才添加括号):
IEnumerable<XElement> lv1s = (
from lv1 in rootElement.Descendants("A")
where (string)lv1.Attribute("Code") == "A001" && (string)lv1.Attribute("Lable") == "A001"
from ltd in lv1.Descendants("A1")
where (string)ltd.Attribute("Code") == "001"
from e in ltd.Elements()
select e
);
此外,如果您只搜索一个级别,则可以使用Elements
代替Descendants
:
IEnumerable<XElement> lv1s = (
from lv1 in rootElement.Elements("A")
where (string)lv1.Attribute("Code") == "A001" && (string)lv1.Attribute("Lable") == "A001"
from ltd in lv1.Elements("A1")
where (string)ltd.Attribute("Code") == "001"
from e in ltd.Elements()
select e
);
如果你想要的只是那些元素的值 - A1
,A2
和A3
- 而不是XElement
个对象:
IEnumerable<string> lv1s = (
from lv1 in rootElement.Elements("A")
where (string)lv1.Attribute("Code") == "A001" && (string)lv1.Attribute("Lable") == "A001"
from ltd in lv1.Elements("A1")
where (string)ltd.Attribute("Code") == "001"
from e in ltd.Elements()
select (string)e
);