XmlReader会丢弃标签间空白字符,如何保留该类有效空白?
问题根因
- 你代码中缺失了对
XmlNodeType.SignificantWhitespace节点类型的处理。两个<span>标签之间的空白属于具备实际语义的显著空白,XmlReader默认会将其归类为SignificantWhitespace而非普通Whitespace节点,因此现有代码逻辑不会把这部分空白写入输出。 - 你当前的元素输出逻辑还存在属性丢失的问题:仅输出了标签名,未处理元素上携带的属性,如果输入XML标签带属性会全部丢失,可根据需求补充对应逻辑。
修正方案
第一步:补充显著空白的处理分支
在你的节点判断逻辑中新增XmlNodeType.SignificantWhitespace的处理,合并空白类节点的输出即可,推荐用StringBuilder替代字符串拼接提升性能,修正后的VB代码示例:
Dim settings = New XmlReaderSettings With { .IgnoreComments = True, .IgnoreWhitespace = False, .Async = False, .CheckCharacters = False } Dim reader = XmlReader.Create(sr, settings) Dim output As New StringBuilder() While reader.Read() If reader.IsStartElement Then output.Append("<" & reader.Name & ">") ' 若需要保留属性,可在这里补充读取属性的逻辑 ElseIf reader.NodeType = XmlNodeType.EndElement output.Append("</" & reader.Name & ">") ElseIf reader.NodeType = XmlNodeType.Text Then output.Append(reader.Value) ' 合并处理两类空白节点 ElseIf reader.NodeType = XmlNodeType.Whitespace OrElse reader.NodeType = XmlNodeType.SignificantWhitespace Then output.Append(reader.Value) Else output.Append(reader.Value) End If End While
第二步:C# 版本同逻辑修正代码
var settings = new XmlReaderSettings { IgnoreComments = true, IgnoreWhitespace = false, Async = false, CheckCharacters = false }; using var reader = XmlReader.Create(sr, settings); var output = new StringBuilder(); while (reader.Read()) { if (reader.IsStartElement()) { output.Append($"<{reader.Name}>"); // 可补充属性处理逻辑 } else if (reader.NodeType == XmlNodeType.EndElement) { output.Append($"</{reader.Name}>"); } else if (reader.NodeType == XmlNodeType.Text) { output.Append(reader.Value); } else if (reader.NodeType is XmlNodeType.Whitespace or XmlNodeType.SignificantWhitespace) { output.Append(reader.Value); } else { output.Append(reader.Value); } }
修改后输入示例中的标签间空白就会正常保留,输出结果和输入一致。
内容的提问来源于stack exchange,提问作者Prof. Falken
相关产品推荐
相关产品推荐

