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 段的主要内容,如果未能解决你的问题,请参考以下文章