C# Linq 计算具有特定值的 XML 段

Posted

技术标签:

【中文标题】C# Linq 计算具有特定值的 XML 段【英文标题】:C# Linq Counting XML segments with specific values 【发布时间】:2021-07-14 03:51:58 【问题描述】:

对 C# 相当陌生。 我试图根据不同字段的值进行一些计算。 我有一个包含以下部分的 XML 文件:

/UniversalInterchange/Body/UniversalShipment/Shipment/ContainerCollection/Container/ContainerType/Code /UniversalInterchange/Body/UniversalShipment/Shipment/ContainerCollection/Container/Commodity/Code /UniversalInterchange/Body/UniversalShipment/Shipment/OrganizationAddressCollection/OrganizationAddress/AddressType="ShippingLineAddress" /UniversalInterchange/Body/UniversalShipment/Shipment/OrganizationAddressCollection/OrganizationAddress/OrganizationCode

现在,ContainerCollection 中的值可以重复(即,我可能有 20 个不同类型的容器 - 例如 40REHC、40GP、40RE、20GP 等)

OrganizationAddressCollection 中的值可以根据 OrganizationAddress 重复,但我只具体说明当 AddressType = ShippingLineAddress 时要找到 OrganizationCode 的内容

我试图实现的是识别航运公司和每个集装箱尺寸的计数和集装箱内的商品,并对每个集装箱应用一个 $ 值。类似:

首先,根据前 2 位数字计算容器的数量(即 5 x 20 和 2 x 40) 然后如果容器商品 = XYZ 并且组织代码是 MYSHIPPING,则将 20 的数量乘以 100 美元,并将 40 的数量乘以 200) 那么如果容器商品 = ABC 并且 OrganizationCode 是 MySHIPPING 则将 20 的数量乘以 50 美元,然后将 40 的数量乘以 100)

这是我正在使用的示例

            <?xml version="1.0" encoding="utf-8"?><UniversalInterchange >
              <Header>
              
              </Header>
              <Body>
                <UniversalShipment >
              <Shipment>
                <ContainerCollection Content="Complete">
                  <Container>
                    <Commodity>
                      <Code>XYZ</Code>
                      <Description>PET FOODS - FROZEN</Description>
                    </Commodity>
                    <ContainerType>
                      <Code>40GP</Code>
                    </ContainerType>
                    </Container>
                        <Container>
                    <Commodity>
                      <Code>XYZ</Code>
                      <Description>PET FOODS - FROZEN</Description>
                    </Commodity>
                    <ContainerType>
                      <Code>40REHC</Code>
                    </ContainerType>
                    </Container>
                          <Container>
                    <Commodity>
                      <Code>ABC</Code>
                      <Description>PET FOODS - FROZEN</Description>
                    </Commodity>
                    <ContainerType>
                      <Code>20GP</Code>
                    </ContainerType>
                    </Container>
                </ContainerCollection>

                <OrganizationAddressCollection>
                  <OrganizationAddress>
                    <AddressType>NotifyParty</AddressType>
                    <OrganizationCode>SOMEONE</OrganizationCode>
                  </OrganizationAddress>
                 <OrganizationAddress>
                    <AddressType>ShippingLineAddress</AddressType>
                    <OrganizationCode>MyShipping</OrganizationCode>
                  </OrganizationAddress>
                  <OrganizationAddress>
                    <AddressType>SendingForwarderAddress</AddressType>
                    <OrganizationCode>ANOTHERORG</OrganizationCode>
                  </OrganizationAddress>
                  </OrganizationAddressCollection>
              </Shipment>
            </UniversalShipment>
              </Body>
            </UniversalInterchange>

【问题讨论】:

【参考方案1】:

这是使用 linq 的开始

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1

    class Program
    
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        
            XDocument doc = XDocument.Load(FILENAME);

            List<Container> containers = doc.Descendants("Container")
                .Select(x => new Container()
                
                    commodityCode = (string)x.Element("Commodity").Element("Code"),
                    description = (string)x.Element("Commodity").Element("Description"),
                    containerCode = (string)x.Element("ContainerType").Element("Code")
                ).ToList();

            var firstTwoDigits = containers.GroupBy(x => int.Parse(x.containerCode.Substring(0, 2))).ToList();

            foreach (var firstTwoDigit in firstTwoDigits)
            
                int numberOfItems = firstTwoDigit.Key * firstTwoDigit.Count();
                foreach (Container container in firstTwoDigit)
                
                    if ((container.commodityCode == "XYZ"))
                    
                    

                
            
                    
        
    
    public class Container
    
        public string commodityCode  get; set; 
        public string description  get; set; 
        public string containerCode  get; set; 
        public int count  get; set; 

    

【讨论】:

以上是关于C# Linq 计算具有特定值的 XML 段的主要内容,如果未能解决你的问题,请参考以下文章

使用 LINQ 的 xml 中特定属性值的列表

LINQ:获取包含具有特定名称和值的属性的数组中的对象

如何使用 jquery 或 javascript 计算具有特定值的行数?

计算特定XML节点c#的子节点数[重复]

Linq 查询以返回具有特定属性值的嵌套数组

C# Linq 对重复值的完全外连接