在c#中读取xml节点的内部xml应使用xmlnode.innerxml属性,它返回子节点序列化字符串而不含当前节点标签;xmldocument适用于已加载文档的随机访问,xmlreader需配合readsubtree和xmlwriter捕获子内容,linq to xml推荐用string.concat(node.nodes().select(n => n.tostring()))。

在C#中读取XML节点的内部XML(即不包含当前节点标签、只含其子内容的字符串),主要通过 XmlNode.InnerXml 属性实现。它返回该节点所有子节点的序列化XML字符串,不含当前节点自身开始/结束标签。
使用 XmlDocument 读取 InnerXml
适用于已加载完整XML文档的场景,适合对结构明确、需随机访问的XML进行操作。
- 先用 XmlDocument.Load() 或 .LoadXml() 加载XML
- 用 SelectSingleNode() 或遍历获取目标节点(如
<content></content>) - 直接访问该节点的 InnerXml 属性即可获取内部XML字符串
示例:
string xml = @"<root><item id='1'><name>Alice</name><age>30</age></item></root>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
XmlNode itemNode = doc.SelectSingleNode("//item");
string inner = itemNode.InnerXml; // 返回 "<name>Alice</name><age>30</age>"
使用 XmlReader 跳过 InnerXml 的限制
XmlReader 不直接提供 InnerXml,因为它属于前向只读流式解析器。若需在流式处理中获取某元素的内部XML,可结合 ReadSubtree() 创建子阅读器,再用 ReadOuterXml() 配合手动剔除外层标签,或更稳妥地用 XmlWriter 捕获子内容。
- 定位到目标元素后调用 reader.ReadSubtree() 得到子树阅读器
- 用 XmlWriter.Create() 写入子树内容,再取字符串
- 注意:子树阅读器不包含起始/结束标签,ReadOuterXml() 在子树中会报错,应避免
使用 LINQ to XML(推荐现代写法)
XElement.Nodes().ToString() 并不能直接等价于 InnerXml;正确方式是用 XElement.Value 获取纯文本,或用 XElement.Nodes().AsXDocument().ToString() ——但更简洁的是:XElement.ToString(SaveOptions.OmitDuplicateNamespaces) 去掉根节点,或直接拼接子节点的 ToString()。
- 最接近 InnerXml 的做法:string inner = String.Concat(node.Nodes().Select(n => n.ToString()))
- 若需格式化输出,可用 new XElement("dummy", node.Nodes()).ToString(),再去除
<dummy></dummy>和 - 注意:XElement.ToString() 默认含声明和缩进,如需紧凑格式,用 SaveOptions.DisableFormatting
注意事项与常见问题
InnerXml 是“未解析”的原始字符串,它不会自动解码HTML实体(如 <)、也不校验嵌套合法性。若内部XML本身含非法结构(如缺失闭合标签),后续再次加载可能失败。
- 赋值给 InnerXml 时,字符串会被解析并作为子节点插入——务必确保格式合法
- 空元素(如
<tag></tag>)的 InnerXml 为空字符串"" - 文本节点、CDATA节、注释等均包含在 InnerXml 结果中
- 若只需纯文本内容,用 InnerText 或 XElement.Value 更安全










