如何编辑 XElement 的内部值

How to edit inner value of XElement

我被困在一个愚蠢的案例中..

我有一个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>
 ...

我想在 Node1 中编辑 Name (bob) 的值。

所以我在使用中隔离了 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)

有人可以帮我吗? :(

谢谢

如果我使用代码 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";