Я начал изучать C # и создаю приложение для форм для автоматизации ввода некоторых данных в моей работе с использованием LINQ to XML. То, что я хотел бы сделать, это изменить атрибут элемента, если у родителя этого элемента есть одноуровневый элемент с определенным значением.
Я бы хотел изменить атрибут «rValue» элемента «Тип» во всех элементах «Стена», кроме тех, которые имеют значение «Ярлык» «Стена гаража». Я хочу, чтобы это было другим значением. Иногда, однако, нет стены гаража.
Вот пример 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>
На данный момент у меня есть код, который применяет изменения только ко всем элементам Стены.
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 сработает, остальное просто перезапишет атрибут. В результате я получаю все стены, имеющие одинаковый атрибут «rValue» в элементе «Тип».
Я новичок, поэтому я прошу прощения, если есть какая-то концепция, которую мне нужно узнать, что я упускаю.
EDIT:
У меня есть для работы со следующим:
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");
}
}