C #: Как изменить XAtrribute, учитывая значение узла-брата его родителя - PullRequest
2 голосов
/ 09 мая 2019

Я начал изучать 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");
                }
            }

1 Ответ

0 голосов
/ 09 мая 2019

Это должно работать, однако предполагается, что каждый элемент стены соответствует некоторым критериям:

  • Они всегда содержат единственный элемент типа
  • Они имеют либо ноль, либо один элемент метки
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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...