C#:在给定其父级同级节点的值的情况下,如何更改XAtrribute

时间:2019-05-08 23:42:34

标签: c# linq-to-xml

我已经开始学习C#,并且正在创建一个表单应用程序,以使用LINQ to XML自动执行工作中的某些数据输入。我想做的是,如果元素的父级具有特定值的同级元素,则更改该元素的属性。

我想在所有Wall元素中更改Type元素的“ rValue”属性,但Label值为“ Garage Wall”的除外。我希望它们具有不同的价值。有时却不存在车库墙。

这是我要编辑的XML的示例

<House>
   <Components>
      <Wall id="17">
        <Label>Garage Wall</Label>
        <Construction corners="3">
          <Type rValue="2.6822">User specified</Type>
        </Construction>
        <Measurements height="2.7706" perimeter="6.5014" />
        <FacingDirection code="1">
        </FacingDirection>
      </Wall>
   </Components>
</House>

这是我目前拥有的代码,仅将更改应用于所有Wall元素。

public XDocument RChanger(XDocument house, decimal rValue, decimal garWallRValue)
{
  string wallType = "Garage Wall";

     foreach (XElement wall in house.Descendants("Wall"))
     {
       if (wallType == wall.Value.ToString())
         {
           foreach (XElement type in wall.Descendants("Type"))
             {
               type.SetAttributeValue("rValue", garWallRValue);
              }
          }
           else 
             foreach (XElement type in wall.Descendants("Type"))
              {
                type.SetAttributeValue("rValue", rValue.ToString());
               }
       }
 return house;
}

它现在的编写方式似乎即使IF语句起作用,其他情况也会覆盖该属性。我得到的结果是,所有墙壁在Type元素中具有相同的“ rValue”属性。

我是一个初学者,所以如果我有一个需要了解的想法,我深表歉意。

编辑: 我已经将其与以下各项配合使用:

string wallType = "Garage Wall";
foreach(XElement wall in house.Descendants("Wall"))
            {
                //Check for garage walls
                foreach(XElement type in wall.Descendants("Type"))
                if (wallType.Equals(wall.Element("Label").Value.ToString()))
                {
                        //if wall is a garage wall
                    type.SetAttributeValue("rValue", "2.92");
                }
                else
                {
                        //if wall is not a garage wall
                    type.SetAttributeValue("rValue", "3.080");
                }
            }

1 个答案:

答案 0 :(得分:0)

这应该可行,但是它假定每个Wall元素都符合某些条件:

  • 它们总是包含一个单个类型元素
  • 它们的标签元素为零或一个
public XDocument RChanger(XDocument house, decimal rValue, decimal garWallRValue)
{
    string wallType = "Garage Wall";
    foreach (var element in house.Descendants("Wall")) {
        var type = element.Descendants("Type").Single();
        if (element.Descendants("Label").SingleOrDefault()?.Value == wallType) {
            // If the label of the element is not the wall type
            type.SetAttributeValue("rValue", garWallRValue);
        } else {
            type.SetAttributeValue("rValue", rValue);
        }
    }
    return house;
}

https://dotnetfiddle.net/Vcz3fd