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>

および 2 番目の 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>

私が欲しいのは、 morelinq features を使用ExceptBy()するか、Linq の Except() 機能でカスタム クラス extends IEqualityComparer を使用して、このようなものを返すことです (1 番目の xml ファイルの 3 番目のタグ価格が異なる場合でも、1 番目の xml ファイルと 2 番目の xml ファイルの間)。DistributorPriceFibrate価値):

<Prices/>

要素「価格」ノードのすべての値を比較するため、特定の要素のみを比較しExcept()たいだけです。<ProductId><EffectiveDate>

それらが同じ場合は、空のタグに移動します<Prices/>ProductIDこれらの要素の値が同じでない場合、同じ値を持たない最初の xml ファイルと2 番目の xml ファイルから値札を返しEffectiveDateます。

私がやったことは、最初の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