【发布时间】:2021-09-07 08:24:55
【问题描述】:
下面的代码将 XML 序列化为一个字符串,然后将其写入一个 XML 文件(是的,在 UTF8 和命名空间的删除方面发生了很多事情):
var bidsXml = string.Empty;
var emptyNamespaces = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });
var settings = new XmlWriterSettings();
settings.Indent = true;
settings.OmitXmlDeclaration = true;
activity = $"Serialize Class INFO to XML to string";
using (MemoryStream stream = new MemoryStream())
using (StreamWriter writer = new StreamWriter(stream, Encoding.UTF8))
{
XmlSerializer xml = new XmlSerializer(info.GetType());
xml.Serialize(writer, info, emptyNamespaces);
bidsXml = Encoding.UTF8.GetString(stream.ToArray());
}
var lastChar = bidsXml.Substring(bidsXml.Length);
var fileName = $"CostOffer_Testing_{DateTime.Now:yyyy.MM.dd_HH.mm.ss}.xml";
var path = $"c:\\temp\\pjm\\{fileName}";
File.WriteAllText(path, bidsXml);
问题是,对 XML 的序列化似乎引入了 CR/LF (NewLine):
在 XML 文件中更容易看到:
一种解决方法是去掉“最后一个”字符:
bidsXml = bidsXml.Substring(0,bidsXml.Length - 1);
但更好的是了解根本原因并在没有解决方法的情况下解决 - 知道为什么将这个 NewLine 字符附加到 XML 字符串吗?
** 编辑 **
我能够尝试加载到消费者应用程序中(在此尝试之前,我使用 API 来导入 XML),并且收到了一条更有说服力的消息:
你加载的文件是二进制文件,这里不能显示内容。
所以我怀疑无法打印的字符以某种方式嵌入到文件/XML 中。当我在 Notepad++ 中打开文件时,我看到以下内容(UFF-8-Byte Order Mark)——至少我还有一些事情要做:
【问题讨论】:
-
有什么问题?空白在 XML 中通常不重要。
-
我从我的 XML 消费者那里收到的反馈相当于“您的 XML 错误”——我没有得到关于它为什么错误的反馈。因此,我正在努力使我的 XML 尽可能干净,以尽我所能消除任何问题。
-
撇开用尾随换行符终止 XML 是否正确,我无法重现您所看到的行为。当我复制您的代码信息时,最后一个字符是'>',unicode value = 003E。见dotnetfiddle.net/KAezsf。
-
如果您不想在文件开头使用BOM,请使用
new UTF8Encoding(false)。见:Force no BOM when saving XML。或者我相信如果您使用Xmlserializer.Serialize(Stream, Object, XmlSerializerNamespaces),则不包括 BOM。 -
顺便说一句,
var lastChar = bidsXml.Substring(bidsXml.Length);不是获取字符串中最后一个字符的正确方法。 c# 字符串是零索引的,所以最后一个字符由bidsXml[bidsXml.Length - 1]给出,包含最后一个字符的字符串是bidsXml.Substring(bidsXml.Length-1)。bidsXml.Substring(bidsXml.Length)只是一个零长度的空字符串。
标签: c# utf-8 xml-namespaces xmlserializer trailing-newline