You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用XDocument向带指定SCENE_NAME属性的SCENE元素内写入内容

问题原因分析

崩溃的核心原因有两点:

  1. XDocument.Element() 方法仅支持直接传入子元素名称查询,不支持XPath语法,你传入XPath字符串无法匹配到对应元素,方法返回null后调用Add方法就会触发空引用异常导致崩溃。
  2. 你提供的原始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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 09:39:03