xmlreadersettings.ignorewhitespace = true 仅在 xmlreader.create 的第二个参数显式传入 settings 时生效,且只跳过纯空白文本节点(xmlnodetype.text),不处理注释、cdata、处理指令等;.net framework 中仍可能返回 xmlnodetype.whitespace,需额外判断。

XmlReaderSettings.IgnoreWhitespace = true 不起作用?检查是否漏设 CreateReader 参数
默认情况下,XmlReader.Create 会忽略你传入的 XmlReaderSettings,除非你显式把它作为第二个参数传进去。很多人写了设置却没生效,就是卡在这儿。
-
XmlReader.Create("file.xml")→ 完全忽略你构造的XmlReaderSettings -
XmlReader.Create("file.xml", settings)→ 才真正启用IgnoreWhitespace - 如果用
Stream或TextReader构造,也必须带settings参数,否则设置无效
IgnoreWhitespace 对哪些空白节点有效?只跳过「纯空白文本节点」
它只跳过 XmlNodeType.Text 类型中内容全为空白(空格、换行、制表符)的节点,不碰注释、CDATA、处理指令,也不影响元素之间的缩进逻辑本身。
- ✅ 跳过:
<root>\n <child></child>\n</root>中的\n \n这类纯空白文本节点 - ❌ 不跳过:
<!-- comment -->、、<?xml version="1.0"?> - ⚠️ 注意:即使设置了
IgnoreWhitespace = true,XmlReader.Read()仍可能返回XmlNodeType.Whitespace—— 这是旧版 .NET Framework 的遗留行为,.NET Core / .NET 5+ 已修复,但若目标框架是net472等,建议额外判断reader.NodeType == XmlNodeType.Text && string.IsNullOrWhiteSpace(reader.Value)
和 XmlReaderSettings.IgnoreComments 混用时要注意顺序和语义
这两个开关互不影响,但一起用时容易误以为「所有非元素节点都消失了」,其实 IgnoreWhitespace 不动注释,IgnoreComments 也不动空白文本——得两个都开才接近「干净结构流」。
- 只开
IgnoreWhitespace:注释还在,空白文本没了 - 只开
IgnoreComments:空白文本还在,注释被跳过 - 两个都开:注释和纯空白文本都被跳过,但
XmlNodeType.SignificantWhitespace(比如xml:space="preserve"内容)仍保留 - 性能上无明显差异,但减少节点数量可略微加快遍历速度,尤其对格式化严重的 XML
.NET Framework 4.x 下 IgnoreWhitespace 在 DTD 或实体解析时可能失效
如果 XML 带内联 DTD 或引用外部 DTD,且启用了 ProhibitDtd = false(默认),某些版本的 XmlReader 会在解析 DTD 过程中插入额外的空白节点,此时 IgnoreWhitespace 无法过滤它们。
- 典型现象:读到意外的
XmlNodeType.Whitespace,位置在/code> 后或实体声明附近 - 临时缓解:设
settings.DtdProcessing = DtdProcessing.Ignore(推荐,除非真需要 DTD 验证) - 根本规避:改用
XDocument.Load(stream, LoadOptions.IgnoreWhitespace),它底层更稳定,且对 DTD 场景处理更一致
实际写的时候最容易忘的是:传了 XmlReaderSettings 却没塞进 Create 调用里;其次是误以为它能吃掉注释或缩进标记——它只认纯空白文本,而且只在你用对 API 的前提下才管用。










