如何修改XElement内部值?修改Node1下Name节点遇问题求助
解决带命名空间的XML节点修改问题
嘿,我一眼就看出问题所在了——你的XML文档带有命名空间,但你在查找元素的时候完全没考虑它,这就是为什么所有查找操作都找不到对应节点,进而抛出空引用或者InvalidOperationException异常。
先看你的XML根节点:
<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest">
这里的xmlns属性定义了整个XML文档的默认命名空间,所有子元素(包括Node1、Name这些)都会继承这个命名空间。LINQ to XML在查找元素时,必须明确指定命名空间才能匹配到对应的节点,否则就会返回null或者找不到元素。
正确的解决方案
首先你需要先定义这个命名空间,然后在所有元素查找操作中带上它:
方案1:修正你最初的Descendants代码
// 先定义XML命名空间 XNamespace ns = "http://schemas.microsoft.com/appx/2010/manifest"; // 查找Node1时带上命名空间 var node1 = xml.Descendants(ns + "Node1").Single(); // 修改Name节点的值,同样要带上命名空间 node1.Element(ns + "Name").Value = "dude";
方案2:修正你第二个代码片段(去掉错误的Parent调用)
XNamespace ns = "http://schemas.microsoft.com/appx/2010/manifest"; // 从根节点开始逐层查找,每个元素都要指定命名空间 var nameElement = xml.Element(ns + "Package") .Element(ns + "Node1") .Element(ns + "Name"); nameElement.Value = "dude";
额外的健壮性建议
如果你的XML文档中Node1或者Name节点可能不存在,建议不要直接用Single(),改用SingleOrDefault()并做null判断,避免程序崩溃:
XNamespace ns = "http://schemas.microsoft.com/appx/2010/manifest"; var node1 = xml.Descendants(ns + "Node1").SingleOrDefault(); if (node1 != null) { var nameElement = node1.Element(ns + "Name"); if (nameElement != null) { nameElement.Value = "dude"; } }
另外还要确保你的xml变量是正确加载的XDocument对象,比如通过XDocument.Load("你的XML文件路径")或者XDocument.Parse("XML字符串")来加载。
内容的提问来源于stack exchange,提问作者Makusensu
相关产品推荐
相关产品推荐

