如何编辑XElement的内部值

时间:2018-05-16 16:29:05

标签: c# linq-to-xml 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)

是的,有人能帮帮我吗? :(

由于

1 个答案:

答案 0 :(得分:0)

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