我有一个格式良好、没有任何空格的 XML。一定是这样的。
当我将其加载到 XMLDocument 进行签名时,自闭合标签会获得额外的空白并且
<cEAN/>
变成:
<cEAN />
一旦必须签署此文件,就无法删除空白。
属性 PreserveWhiteSpace 对结果没有任何影响。
我怎样才能改变这种行为?
XmlDocument
中的结束符“/”之前没有空格。 XmlDocument
是由节点组成的数据结构。它是二进制的。这不是文字。
仅当您将文档序列化为文本时,您看到的任何额外空间才存在。
您实际上在签名方面遇到问题吗?还是您只是认为自己将会遇到这样的问题?
我以前也遇到过这个问题。 XML 由基本哈希签名,因此在序列化时不会更改。我通过编写一个序列化器解决了这个问题,这样我就可以确定它会输出正确的 XML。
基本方法是使用 XMLReader 读取 XML,并在出现时写出每个块。
我的思路如下:
var stream = new MemoryStream();
var writerSettings = new XmlWriterSettings
{
Indent = true,
IndentChars = " ",
NewLineChars = Environment.NewLine,
NewLineHandling = NewLineHandling.Replace,
OmitXmlDeclaration = true,
};
using (var xrmService = new XrmServiceContext(context.Service))
using (XmlWriter writer = XmlWriter.Create(stream, writerSettings))
{
writer.WriteStartElement("xyz");
writer.WriteElementString("abc", "123");
...
writer.WriteEndElement();
writer.Flush();
}
string stringXml = Encoding.UTF8.GetString(stream.ToArray()).Replace(" />", "/>");
将字符串转换回流以便能够写入文件
byte[] byteArray = Encoding.UTF8.GetBytes(stringXml);
MemoryStream formattedStream = new MemoryStream(byteArray);
将流写入文件
using (FileStream file = new FileStream(@"filepath\file.xml",
FileMode.Create, FileAccess.Write))
{
formattedStream.CopyTo(file);
file.Flush();
}
formattedStream.Flush();
帮助我实现这一目标的资源:
试试这个:
XMLDocument doc;
...
string XMLstring = doc.OuterXml.Replace(" />","/>");