0

下面的代码将 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)——至少我还有一些事情要做:

在此处输入图像描述

4

1 回答 1

0

因此,我的 XML 的使用者似乎不希望流中的 BOM(字节顺序标记)。

访问此站点UTF-8 BOM 在 C# 中的冒险

我已经更新了我的代码以使用新的 UTF8Encoding(false))而不是Encoding.UTF8

var utf8NoBOM = new UTF8Encoding(false);

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, utf8NoBOM))
{
  XmlSerializer xml = new XmlSerializer(info.GetType());

  xml.Serialize(writer, info, emptyNamespaces);

  bidsXml = utf8NoBOM.GetString(stream.ToArray());
}


var fileName = $"CostOffer_Testing_{DateTime.Now:yyyy.MM.dd_HH.mm.ss}.xml";

var path = $"c:\\temp\\pjm\\{fileName}";
File.WriteAllText(path, bidsXml, utf8NoBOM);
于 2021-06-23T20:59:45.417 回答