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

C# XML转Fast-Infoset时意外修剪空白及CR字符问题求助

解决C#生成Fast Infoset时XML空白字符被修剪的问题

我需要将普通XML编码为Fast Infoset文档,使用NuGet包LiquidTechnologies.FastInfoset。原XML在transactionType="InventoryJob">标签后、子元素前包含CR LF和空白字符,但C#生成的Fast Infoset会修剪这些空白,而目标Java系统生成的文档保留了空白(仅忽略CR)。需要让C#生成的结果和Java一致。

核心思路

问题根源在于XML解析和Fast Infoset编码阶段默认会忽略空白节点,需要调整两处的配置来保留空白,同时对齐Java的CR处理逻辑。

1. 调整XML解析器,保留空白节点

默认的XML解析器会忽略元素间的空白,需要显式关闭这个行为:

var xmlSettings = new XmlReaderSettings
{
    IgnoreWhitespace = false, // 关键:不忽略空白节点
    CloseInput = true
};

using var xmlReader = XmlReader.Create("input.xml", xmlSettings);

2. 配置Fast Infoset编码器,启用空白保留

LiquidTechnologies.FastInfoset的FastInfosetWriter支持通过设置PreserveWhitespace属性来保留空白:

using var fsStream = new FileStream("output.finf", FileMode.Create);
using var fsWriter = new FastInfosetWriter(fsStream);
fsWriter.PreserveWhitespace = true; // 启用空白保留

XmlWriter.Create(fsWriter).WriteNode(xmlReader, true);

3. 对齐Java的CR处理(可选)

如果Java生成的文档会将CR LF转换为LF,可在解析前先预处理XML内容,替换CR为空白:

var xmlContent = File.ReadAllText("input.xml").Replace("\r", "");
using var stringReader = new StringReader(xmlContent);
using var xmlReader = XmlReader.Create(stringReader, xmlSettings);

完整示例代码

using LiquidTechnologies.FastInfoset;
using System.IO;
using System.Xml;

// 读取XML并预处理(替换CR)
var xmlContent = File.ReadAllText("input.xml").Replace("\r", "");
var xmlSettings = new XmlReaderSettings { IgnoreWhitespace = false };

using var stringReader = new StringReader(xmlContent);
using var xmlReader = XmlReader.Create(stringReader, xmlSettings);

// 生成Fast Infoset
using var fsStream = new FileStream("output.finf", FileMode.Create);
using var fsWriter = new FastInfosetWriter(fsStream);
fsWriter.PreserveWhitespace = true;

using var xmlWriter = XmlWriter.Create(fsWriter);
xmlWriter.WriteNode(xmlReader, true);

验证结果

修改后生成的Fast Infoset文档会保留transactionType="InventoryJob">后的空白字符,且CR被替换为LF,与Java生成的文档一致。

内容的提问来源于stack exchange,提问作者Hai Nguyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 21:15:41