草庐IT

c# - 删除结束元素的空间?

coder 2024-07-02 原文

目前我正在使用 XML 来存储许多数据,在创建这些 XML 文件时,我想尽可能地减少它的大小。

我如何覆盖 XmlWriter 函数 (WriteEndElement),而不是像这样保存它:

<thisElement someAttribute="blabla" />

它将被保存为:

<thisElement someAttribute="blabla"/>   

更新:

我正在尝试找到一种方法来完成此任务:

public override void WriteEndElement()

但我无法通过当前的 WriteEndElement 函数来了解我必须对其进行更改的内容以及是否有可能。

最佳答案

恐怕不重写大部分代码是不可能的。该空间是硬编码在内部类中的,不可配置。

例如,内部 XmlEncodedRawTextWriter.WriteEndElement() 方法的代码片段。

internal override void WriteEndElement(string prefix, string localName, string ns)
{
    // snip...
    else
    {
        this.bufPos--;
        this.bufChars[this.bufPos++] = ' '; // the space is hard coded
        this.bufChars[this.bufPos++] = '/';
        this.bufChars[this.bufPos++] = '>';
    }
}

我能想到的一些选项是解析输出的 XML 以搜索结束标记以手动删除空格,实现您自己的 XML 编写器以使其不包含此空格,或者编写包装类在写入结束元素时使用反射修改内部缓冲区。


这是一个可以做到这一点的扩展方法。请注意,这不是可移植的。尽管它似乎适用于简单的情况,但也不能保证适用于所有情况。我不认为这里所做的会破坏作者的状态,但是,使用风险自负

public static class XmlWriterExtensions
{
    private static readonly Func<XmlWriter, object> get_writer;
    private static readonly Func<object, char[]> get_bufChars;
    private static readonly Func<object, int> get_bufPos;
    private static readonly Action<object, int> set_bufPos;

    static XmlWriterExtensions()
    {
        var asm = Assembly.GetAssembly(typeof(XmlWriter));
        var xmlWellFormedWriterType = asm.GetType("System.Xml.XmlWellFormedWriter");
        var flags = BindingFlags.NonPublic | BindingFlags.Instance;
        var writerField = xmlWellFormedWriterType.GetField("writer", flags);
        get_writer = w => writerField.GetValue(w);
        var xmlEncodedRawTextWriterType = asm.GetType("System.Xml.XmlEncodedRawTextWriter");
        var bufCharsField = xmlEncodedRawTextWriterType.GetField("bufChars", flags);
        var bufPosField = xmlEncodedRawTextWriterType.GetField("bufPos", flags);
        get_bufChars = w => (char[])bufCharsField.GetValue(w);
        get_bufPos = w => (int)bufPosField.GetValue(w);
        set_bufPos = (w, i) => bufPosField.SetValue(w, i);

    }

    public static void TrimElementEnd(this XmlWriter writer)
    {
        var internalWriter = get_writer(writer);
        char[] bufChars = get_bufChars(internalWriter);
        int bufPos = get_bufPos(internalWriter);
        if (bufPos > 3 && bufChars[bufPos - 3] == ' ' && bufChars[bufPos - 2] == '/' && bufChars[bufPos - 1] == '>')
        {
            bufChars[bufPos - 3] = '/';
            bufChars[bufPos - 2] = '>';
            bufPos--;
            set_bufPos(internalWriter, bufPos);
        }
    }
}

// usage:
Console.OutputEncoding = Encoding.UTF8;
using (var writer = XmlWriter.Create(Console.Out))
{
    writer.WriteStartElement("Foo");
    writer.WriteElementString("Bar", null);
    writer.TrimElementEnd();
    writer.WriteElementString("Baz", null);
    writer.WriteEndElement();
}

<?xml version="1.0" encoding="utf-8"?><Foo><Bar/><Baz /></Foo>

关于c# - 删除结束元素的空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4600569/

有关c# - 删除结束元素的空间?的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  3. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  4. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  5. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  6. ruby - 如何安全地删除文件? - 2

    在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

  7. ruby - 在哈希的键数组中追加元素 - 2

    查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用

  8. ruby-on-rails - 标准化文件名的字符串,删除重音和特殊字符 - 2

    我正在尝试找到一种方法来规范化字符串以将其作为文件名传递。到目前为止我有这个:my_string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.gsub(/[^a-z]/,'_')但第一个问题:-字符。我猜这个方法还有更多问题。我不控制名称,名称字符串可以有重音符、空格和特殊字符。我想删除所有这些,用相应的字母('é'=>'e')替换重音符号,并将其余的替换为'_'字符。名字是这样的:“Prélèvements-常规”“健康证”...我希望它们像一个没有空格/特殊字符的文件名:“prelevements_routin

  9. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  10. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

随机推荐