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
相关产品推荐
相关产品推荐

