在XML的内部元素中使用where条件
本文关键字:where 条件 元素 XML 内部 | 更新日期: 2023-09-27 18:02:47
我正在尝试解析一个XML文档,并使用C#中的LINQ将数据存储在一个数组中,其中我有多个内部元素,它们的属性具有相同的名称,看起来像
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Catalog>
<Book ISBN="1.1.1.1" Genre="Thriller">
<Title PublishDt="2015-07-09">
<Pty R="1" ID="Buyer_Company">
</Pty>
<Pty R="2" ID="Seller_Company">
</Pty>
</Title>
</Book>
</Catalog>
我正试图将以上所有数据存储在一个数组中。我不知道如何处理元素Pty
,其中我必须将Buyer_Company
存储在Buy
中,将Seller_Company
存储在Sell
中,因为它们具有相同的元素名称和属性名称ID。
我得到的剩余数据如下
var result = doc.Descendants("Book")
.Select(b => new
{
ISBN= b.Attribute("ISBN").Value,
Genre=b.Attribute("Genre").Value,
PublishDate= b.Element("Title").Attribute("MMY").Value,
Sell=b.Element("Title").Element("Pty").Attribute("ID").Value.Where......
Buy=b.Element("Title").Element("Pty").Attribute("ID").Value.Where......(this is where I have issues)
})
.ToArray();
我可以知道如何使用内部元素中的WHERE
条件和C#
中LINQ
中XML
的属性吗?R=1表示买方,R=2表示卖方
你需要按顺序思考。您希望查询所有Pty
元素,然后根据R
属性值对其进行筛选,然后获得所需的属性。
因此,您的买家id可以通过以下方式获得:
b.Descendants("Pty")
.Where(e => (int)e.Attribute("R") == 1)
.Select(e => (string)e.Attribute("ID"))
.Single();
以及类似的卖家id查询(将1
更改为2
(。综合起来,你可能会得到这样的结果。我将转换移到了表达式的开头,以便更清楚地了解属性的类型。
var result = from book in doc.Descendants("Book")
select new
{
ISBN = (string)book.Attribute("ISBN"),
Genre = (string)book.Attribute("Genre"),
PublishDate = (DateTime)book.Elements("Title")
.Select(e => e.Attribute("PublishDt"))
.Single(),
Buyer = (string)book.Descendants("Pty")
.Where(e => (int)e.Attribute("R") == 1)
.Select(e => e.Attribute("ID"))
.Single(),
Seller = (string)book.Descendants("Pty")
.Where(e => (int)e.Attribute("R") == 2)
.Select(e => e.Attribute("ID"))
.Single()
};
如果您在那里应用Where
子句,那么您将再次获得IEnumerable<XElement>
,并且您必须从中选择一个seller''buyer,或者获取一个seller ''buyer数组。我已经考虑到你将只有两个节点用于买方和卖方,因此查询是:-
var result = doc.Descendants("Book")
.Select(b =>
{
var buyerNode = b.Element("Title").Elements("Pty")
.First(x => x.Attribute("R").Value == "1");
var sellerNode = b.Element("Title").Elements("Pty")
.First(x => x.Attribute("R").Value == "2");
return new
{
ISBN = b.Attribute("ISBN").Value,
Genre = b.Attribute("Genre").Value,
PublishDate = b.Element("Title").Attribute("PublishDt").Value,
Buy = buyerNode.Attribute("ID").Value,
Sell = sellerNode.Attribute("ID").Value,
};
}
).ToArray();
此外,请注意,您将需要Elements
而不是Element
来获取多个Pty
节点。