我已经开始学习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");
}
}
答案 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;
}