我被困在一个愚蠢的案子上..
我有一个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)
是的,有人能帮帮我吗? :(由于
答案 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";