1

有2个xml文件

第一个 xml 文件包含:

<Prices>
    <Price>
        <SalesOrg>700</SalesOrg>
        <AreaOfPricing>D20</AreaOfPricing>
        <ProductId>20228090</ProductId>
        <EffectiveDate>2015-05-11T00:00:00+7</EffectiveDate>
        <DistributorPriceFibrate>200</DistributorPriceFibrate>
        <CustomerPriceFibrate>20</CustomerPriceFibrate>
        <CustomerPriceInDozen>30</CustomerPriceInDozen>
        <CustomerPriceinPC>80.00</CustomerPriceinPC>
        <CompanyID>001</CompanyID>
        <ValidTo>2999-12-31T00:00:00+7</ValidTo>
        <UOM>CS</UOM>
        <Currency>IDR</Currency>
    </Price>
<Price>
        <SalesOrg>700</SalesOrg>
        <AreaOfPricing>D20</AreaOfPricing>
        <ProductId>20228090</ProductId>
        <EffectiveDate>2015-05-11T00:00:00+7</EffectiveDate>
        <DistributorPriceFibrate>200</DistributorPriceFibrate>
        <CustomerPriceFibrate>20</CustomerPriceFibrate>
        <CustomerPriceInDozen>30</CustomerPriceInDozen>
        <CustomerPriceinPC>80.00</CustomerPriceinPC>
        <CompanyID>001</CompanyID>
        <ValidTo>2999-12-31T00:00:00+7</ValidTo>
        <UOM>CS</UOM>
        <Currency>IDR</Currency>
    </Price>
<Price>
        <SalesOrg>700</SalesOrg>
        <AreaOfPricing>D20</AreaOfPricing>
        <ProductId>20228090</ProductId>
        <EffectiveDate>2015-05-11T00:00:00+7</EffectiveDate>
        <DistributorPriceFibrate>180</DistributorPriceFibrate>
        <CustomerPriceFibrate>20</CustomerPriceFibrate>
        <CustomerPriceInDozen>30</CustomerPriceInDozen>
        <CustomerPriceinPC>80.00</CustomerPriceinPC>
        <CompanyID>001</CompanyID>
        <ValidTo>2999-12-31T00:00:00+7</ValidTo>
        <UOM>CS</UOM>
        <Currency>IDR</Currency>
    </Price>
</Prices>

和第二个 xml 文件:

<Prices>
    <Price>
        <SalesOrg>700</SalesOrg>
        <AreaOfPricing>D20</AreaOfPricing>
        <ProductId>20228090</ProductId>
        <EffectiveDate>2015-05-11T00:00:00+7</EffectiveDate>
        <DistributorPriceFibrate>200</DistributorPriceFibrate>
        <CustomerPriceFibrate>20</CustomerPriceFibrate>
        <CustomerPriceInDozen>30</CustomerPriceInDozen>
        <CustomerPriceinPC>80.00</CustomerPriceinPC>
        <CompanyID>001</CompanyID>
        <ValidTo>2999-12-31T00:00:00+7</ValidTo>
        <UOM>CS</UOM>
        <Currency>IDR</Currency>
    </Price>
</Prices>

我想要的是,ExceptBy()在 Linq 中使用 morelinq features 或使用自定义类扩展 IEqualityComparer 上的 except() 功能以返回类似的内容(在第一个 xml 文件和第二个 xml 文件之间,即使第一个 xml 文件上的第三个标签价格有不同DistributorPriceFibrate价值):

<Prices/>

由于比较元素“价格”节点上的所有值,Except()我只想比较特定的元素。<ProductId><EffectiveDate>

如果它们相同,则转到 empty tag <Prices/>。如果这些元素的值不同,则从第一个 xml 文件中返回价格标签,该文件具有不同的值ProductIDEffectiveDate第二个 xml 文件。

我所做的我区分了第一个 xml 文件:

var distinctItemsonxmldoc1 =
                xmldoc1
                .Descendants("Price")
                .DistinctBy(element => new
                {
                    ProductId = (string)element.Element("ProductId"),
                    EffectiveDate = (string)element.Element("EffectiveDate")
                });
var afterdistinctxmldoc1 = new XElement("Prices");
            foreach (var a in distinctItemsonxmldoc1 )
            {
                afterdistinctxmldoc1.Add(a);
            }

当使用 except 来比较 2 个文件时:

var afterexcept = afterdistinctxmldoc1.Descendants("Price").Cast<XNode>().Except(xmldoc2.Descendants("Price").Cast<XNode>(), new XNodeEqualityComparer());

但它比较价格节点上的所有元素值。如何在特定元素中使用 exceptBy()?或自定义 IComparer 也许?

之前谢谢。

编辑
已经解决了。请参阅@dbc 的答案

4

1 回答 1

2

为了确认我理解您的问题:给定两个 XML 文档,您希望枚举Price第一个文档中每个元素的实例,其中子元素和具有不同的值,跳过所有与第二个文档中的元素匹配的元素,使用.ProductIdEffectiveDateProductIdEffectiveDatePriceMoreLinq

在这种情况下,您可以这样做:

        var diff = xmldoc1.Descendants("Price").ExceptBy(xmldoc2.Descendants("Price"),
            e => new { ProductId = e.Elements("ProductId").Select(p => p.Value).FirstOrDefault(), EffectiveDate = e.Elements("EffectiveDate").Select(p => p.Value).FirstOrDefault() });
于 2015-05-10T21:40:31.137 回答