<?xml version="1.0" encoding="utf-8"?>
<OrdersReport Date="2012-08-01">
<Returns>
<Amount>
<OrderId>2</OrderId>
<OrderId>3</OrderId>
<OrderId>21</OrderId>
<OrderId>23</OrderId>
</Amount>
</Returns>
</OrdersReport>
这是我试图获得OrderId的代码:
var amount = doc.Descendants("Amount")
.Select(y => new
{
OrderId = (int)y.Element("OrderId")
});
foreach (var r in amount)
{
Console.WriteLine(r.OrderId);
}
Console.Read();
我的输出是:
2
2
答案 0 :(得分:3)
你可以这样做:
var orderIds = doc.Descendants("OrderId");
foreach (var orderId in orderIds)
{
Console.WriteLine(orderId.Value);
}
或者,在这种情况下将是相同的:
var orders = doc.Descendants("Amount")
.Descendants("OrderId");
答案 1 :(得分:2)
var orderIds = doc.Descendants("OrderId")
.Select(e => e.Value)
.ToArray();
结果将是:
[2, 3, 21, 23]
答案 2 :(得分:1)
仅供参考信息
XContainer.Descendants Method (XName) - 按文档顺序返回此文档或元素的后代元素的过滤集合。只有具有匹配XName的元素才会包含在集合中。
所以在您的代码中
var amount = doc.Descendants("Amount")
.Select(y => new
{
OrderId = (int)y.Element("OrderId")
});
这会给你元素Amount
,当你写y.Element("OrderId")
时,它会返回你孩子的第一个元素。
所以要获取所有订单ID元素,您需要写下doc.Descendants("OrderId")
或documentRoot.Descendants("Amount").Descendants()
Descendants
- 并不意味着它返回你在desendant方法中写的元素名的子元素。
最后以正确的方式为我解决方案
XElement documentRoot = XElement.Parse (@"<OrdersReport Date='2012-08-01'>
<Returns>
<Amount>
<OrderId>21</OrderId>
<OrderId>3</OrderId>
</Amount>
</Returns>
</OrdersReport>");
var orderids = from order in
documentRoot.Descendants("Amount").Descendants()
select new
{
OrderId = order.Value
};