如何让XMLDocument不在自闭合标签上放置空格?

问题描述 投票:0回答:4

我有一个格式良好、没有任何空格的 XML。一定是这样的。

当我将其加载到 XMLDocument 进行签名时,自闭合标签会获得额外的空白并且

    <cEAN/>

变成:

     <cEAN />

一旦必须签署此文件,就无法删除空白。

属性 PreserveWhiteSpace 对结果没有任何影响。

我怎样才能改变这种行为?

c# c#-4.0 xmldocument signedxml
4个回答
1
投票

XmlDocument
中的结束符“/”之前没有空格。
XmlDocument
是由节点组成的数据结构。它是二进制的。这不是文字。

仅当您将文档序列化为文本时,您看到的任何额外空间才存在。

您实际上在签名方面遇到问题吗?还是您只是认为自己将会遇到这样的问题?


0
投票

我以前也遇到过这个问题。 XML 由基本哈希签名,因此在序列化时不会更改。我通过编写一个序列化器解决了这个问题,这样我就可以确定它会输出正确的 XML。

基本方法是使用 XMLReader 读取 XML,并在出现时写出每个块。


0
投票

我的思路如下:

  1. 创建流:

    var stream = new MemoryStream();

  1. 创建 XML 并将其保存到流中:

           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();
            }

  1. 将流转换为字符串以便能够重新格式化

    string stringXml = Encoding.UTF8.GetString(stream.ToArray()).Replace(" />", "/>");

  1. 将字符串转换回流以便能够写入文件

    
     byte[] byteArray = Encoding.UTF8.GetBytes(stringXml);
           MemoryStream formattedStream = new MemoryStream(byteArray);
    
  2. 将流写入文件


    using (FileStream file = new FileStream(@"filepath\file.xml", 
               FileMode.Create, FileAccess.Write))
                {
                    formattedStream.CopyTo(file);
                    file.Flush();
                }
                formattedStream.Flush();

帮助我实现这一目标的资源:


0
投票

试试这个:

XMLDocument doc;

...

string XMLstring = doc.OuterXml.Replace(" />","/>");
© www.soinside.com 2019 - 2024. All rights reserved.