Как редактировать внутреннее значение XElement - PullRequest
0 голосов
/ 16 мая 2018

Я застрял в немом случае ..

У меня есть XML как:

<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest">
 <Identity="title" text2="text" text3="text" />
 <Node1>        
  <Name>bob</Name>
  <Age>30</Age>
  <Image>img.png</Image>
  <Country>blabla</Country>
 </Node1>
 <Node2>
  <Elem1>6.2</Elem1>
  <Elem1>6.2</Elem1>
 </Node2>
 <Node3>
  <Elem1>6.2</Elem1>
  <Elem1>6.2</Elem1>
 </Node3>
 ...

Я хочу отредактировать значение Name (bob) внутри Node1.

Итак, я выделил данные Node1 при использовании:

var name = xml.Descendants().Where(p => p.Name.LocalName.Equals("Node1")).Single();

Но я застрял при присвоении нового значения, эта строка получает нулевое исключение.

name.Element("Name").Value = "dude";

Я пробовал другие вещи, такие как

var name = xml.Elements("Package").Elements("Node1").Single().Parent.Element("Name");
    name.Value = "dude";

Но это тоже не работает (System.InvalidOperationException)

Может кто-нибудь помочь мне, пожалуйста? (

Спасибо

1 Ответ

0 голосов
/ 16 мая 2018

Если я использую код xml.Element("Package").Element("Node1").Element("Name").Value = "dude";, он работает как положено: он устанавливает значение "dude".Как видите, он также намного проще, чем ваш подход, поскольку он не использует .Single().Parent или .Where()

Кстати: <Identity="title" text2="text" text3="text" /> является недопустимым XML.

Проблемы вызваны пространством имен.Вы можете удалить атрибут пространства имен из XElement с помощью этого кода:

public static void RemoveNamespace(this XElement element)
{
    element.Attributes().Where(x => x.IsNamespaceDeclaration).Remove();
    element.Name = element.Name.LocalName;
}

В вашем случае это будет работать:

var name = xml.Descendants().Where(p => p.Name.LocalName.Equals("Node1")).Single();
name.Elements().Where(p => p.Name.LocalName.Equals("Name")).FirstOrDefault().RemoveNamespace();
name.Element("Name").Value = "dude";
...