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
相关产品推荐
相关产品推荐

