使用linq比较2个不一致的xml文件
本文关键字:xml 文件 不一致 2个 linq 比较 使用 | 更新日期: 2023-09-27 18:29:32
我有两个xml文件,product.xml和rule.xml。
Rule.xml
<Attr>
<name>3D</name>
<category addto="name">AddString</category>
<transformingvalue>{0} capable</transformingvalue>
<comparingvalue></comparingvalue>
</Attr>
<Attr>
<name>Diagonal Size</name>
<name>Diagonal Size (cm)</name>
<name>Display Size</name>
<name>Display Type</name>
<name>Tablet size</name>
<name>Tablet size (cm)</name>
<category addto="transformed">AddString</category>
<transformingvalue>{0} Display</transformingvalue>
<comparingvalue></comparingvalue>
</Attr>
<Attr>
<name>Battery Life</name>
<category sub="ToValueBasedOnValueAddStringToTransformed">StringToNumAddString</category>
<transformingvalue id="1">{0} hours</transformingvalue>
<transformingvalue id="2">{0} mins</transformingvalue>
<tranformingvalue id="3" >Battery Life-{0}</tranformingvalue>
<comparingvalue operator="<=">60</comparingvalue>
</Attr>
产品.xml
<Attr>
<name>3D</name>
<value>yes</value>
</Attr>
<Attr>
<name>Diagonal Size</name>
<value>20.1in</value>
</Attr>
<Attr>
<name>Display Size</name>
<value>11.1in</value>
</Attr>
<Attr>
<name>Battery Life</name>
<value>5</value>
</Attr>
我想根据规则文件更改产品文件中的值元素。例如,如果对于3D名称元素,产品文件中的值元素为yes,那么根据规则文件,该元素的值元素将在产品文件中具有3D功能。所以它将是
<Attr>
<name>3D</name>
<value>3D Capable</value>
</Attr>
因此,如果name元素在这两个xml中都匹配,并且我不想要两个foreach循环,我想使用Linq从这两个xml中提取数据,但由于Rules.xml中的数据不统一,我陷入了困境。
一个foreach循环迭代两个IEnumerable<XElement>
怎么样?
var fileA = productA.Descendants("Attr").Select(a => new
{
Name = a.Element("name").Value,
Value = a.Element("value").Value
});
var fileB = productB.Descendants("Attr").Select(a => new
{
Name = a.Element("name").Value,
Value = a.Element("value").Value
});
var rules = xe.Descendants("Attr").Select(r => new
{
Names = r.Elements("name"),
Category = r.Element("category").Value
TransformingValue = r.Elements("transformingvalue")
ComparingValue = r.Element("comparingvalue").Value
});
foreach(var node in fileA) {
// Or whatever comparison your need from Rules.xml
if (fileB.Any(n => n.Name == node.Name && n.Value != node.Value))
{
//DoSomething();
//break;?
}
}