在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#LINQXML的属性吗?R=1表示买方,R=2表示卖方

在XML的内部元素中使用where条件

你需要按顺序思考。您希望查询所有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节点。