如何使用XDocument向带指定SCENE_NAME属性的SCENE元素内写入内容
问题原因分析
崩溃的核心原因有两点:
XDocument.Element()方法仅支持直接传入子元素名称查询,不支持XPath语法,你传入XPath字符串无法匹配到对应元素,方法返回null后调用Add方法就会触发空引用异常导致崩溃。- 你提供的原始XML存在语法错误,多了一行多余的
</SCENE>闭合标签,需要先修正该错误再做后续操作,否则XML加载阶段就会报错。
正确实现方案
方案1:使用XPath查询(需引入额外命名空间)
先引用System.Xml.XPath命名空间,使用专门的XPath查询方法定位元素:
using System.Xml.XPath; // 必须引入该命名空间才可使用XPath扩展方法 // 核心操作代码 XDocument doc = XDocument.Load("Database.xml"); XElement root = new XElement("XYZ"); root.Add(new XElement("tName", "VIRAT")); // 执行XPath查询定位目标SCENE元素 var targetScene = doc.XPathSelectElement("//DATABASE/SCENE[@SCENE_NAME='SCENE_TestSene']"); // 增加空判断避免找不到元素时报错 if(targetScene != null) { targetScene.Add(root); } doc.Save("Database.xml");
方案2:使用原生LINQ to XML查询(无需额外引入命名空间)
如果不想使用XPath,也可以用LINQ语法筛选目标元素:
XDocument doc = XDocument.Load("Database.xml"); XElement root = new XElement("XYZ"); root.Add(new XElement("tName", "VIRAT")); // LINQ筛选符合属性条件的SCENE元素 var targetScene = doc.Descendants("SCENE") .FirstOrDefault(s => s.Attribute("SCENE_NAME")?.Value == "SCENE_TestSene"); if(targetScene != null) { targetScene.Add(root); } doc.Save("Database.xml");
补充说明
操作前先修正原始XML的语法错误,修正后的原始XML结构如下:
<?xml version="1.0" encoding="utf-8"?> <!--This file is generated by the program.--> <DATABASE> <SCENE SCENE_NAME="SCENE_TestSene"></SCENE> </DATABASE>
执行上述任意一种方案的代码后,即可得到你期望的最终XML结构。
内容的提问来源于stack exchange,提问作者Summit
相关产品推荐
相关产品推荐

