Как изменить значение дочернего элемента на основе атрибута child и parent?

1

учитывая этот xml файл

<root>
 <event id="123">
     <option subID="1">English</option>
     <option subID="2">German</option>
     <option subID="3">French</option>
     <option subID="4">Spanish</option>
 </event>
</root>

Как изменить значение испанского на японский?

У меня есть этот запрос linq:

var nodeToEdit = xml.Descendants("event").Where(x => (string)x.Attribute("subID") == "4");

и после выполнения некоторых вещей с этим запросом я использую это, чтобы изменить значение:

foreach(var item in nodeToEdit.Elements())
{
    var query = item.Descendants("option").Where(z => (string)z.Attribute("subID").Value == "4");
    foreach (var bla in query)
    {
        bla.Value = "Japanese"; // bla.Value = Spanish
    }
}

но когда я отлаживаю, я вижу, что мой query не имеет результатов.

  • 0
    Вы уверены, что ваш XML не использует пространства имен?
  • 0
    <event> не имеет атрибута subID : var nodeToEdit = xml.Descendants("event").Where(x => (string)x.Attribute("subID") == "4");
Теги:
linq

1 ответ

0

Если это ваш фактический код и XML, то да, это не сработает по нескольким причинам. Это один из возможных способов исправить это:

//select <event> node by id attribute
var nodeToEdit = xml.Descendants("event")
                    .FirstOrDefault(x => (string)x.Attribute("id") == "123");
if(nodeToEdit != null)
{
    //select <option> node within current <event> by subID attribute
    var optionToEdit = nodeToEdit.Elements()
                                 .FirstOrDefault(z => (string)z.Attribute("subID") == "4");
    optionToEdit.Value = "Japanese";
}

Или, только если следующее это будет считаться читаемым для вас, вы можете сделать за один проход:

//select <option> node based on id attribute of it parent & subID attribute of it own
var nodeToEdit = xml.Descendants("option")
                    .FirstOrDefault(x => (string)x.Parent.Attribute("id") == "123"
                                            &&
                                         (string)x.Attribute("subID") == "4"
                                   );

Ещё вопросы

Сообщество Overcoder
Наверх
Меню