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

C#中用XmlDocument复制XmlReader元素时遇DocumentElement错误求助

解决XmlDocument加载XmlReader时的"DocumentElement已存在"错误

问题原因

直接调用xmlDocument.Load(reader)会尝试将XmlReader的全部内容加载为完整XML文档,若XmlReader当前指向的不是根节点,或者加载逻辑导致重复创建根节点,就会触发"The document already has a 'DocumentElement' node."错误。同时这种方式会移动原XmlReader的读取位置,不符合你的需求。

解决方案

通过XmlReader.ReadSubtree()克隆当前元素的子读取器,既不会移动原读取器位置,又能将单个元素加载为XmlDocument的根节点,直接提取内部XML。

修正后的代码

XmlDocument xmlDocument = new XmlDocument();
// 克隆当前元素的子读取器,原reader位置保持不变
using (XmlReader subReader = reader.ReadSubtree())
{
    xmlDocument.Load(subReader);
}
// 直接获取目标元素的内部XML
sb.Append(xmlDocument.DocumentElement.InnerXml);

关键说明

  • ReadSubtree()会生成一个仅包含当前元素及其子节点的新XmlReader,原XmlReader的位置在调用后不会改变。
  • 无需通过MemoryStream中转,直接利用XmlDocument的DocumentElement.InnerXml即可获取内部XML,简化代码逻辑。
  • 使用using语句自动释放子读取器资源,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Patrick Pirzer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:01:36