0

我有 2 个 xml 文件,product.xml 和 rule.xml。

规则.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="&lt;=">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>

所以我想使用 Linq 从两个 xml 中选择数据,如果 name 元素在两者中匹配并且我不想要两个 foreach 循环,但由于 Rules.xml 中的数据不统一,我被卡住了。

4

1 回答 1

1

一个 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;?
    }
}
于 2013-08-30T07:01:09.763 回答