如何编辑 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";
我被困在一个愚蠢的案例中..
我有一个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";