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 による回答を参照してください。