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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:57:05