Xml可以用<;压缩吗/&燃气轮机;结束元素?

Xml可以用<;压缩吗/&燃气轮机;结束元素?,xml,compression,Xml,Compression,是否有任何理由可以使用如下XML: <person> <firstname>Joe</firstname> <lastname>Plumber</lastname> </person> 乔 水暖工 无法对客户端/服务器传输进行这样的压缩 <person> <firstname>Joe</> <lastname>

是否有任何理由可以使用如下XML:

<person>    
    <firstname>Joe</firstname>    
    <lastname>Plumber</lastname>
</person>

乔
水暖工
无法对客户端/服务器传输进行这样的压缩

<person>    
    <firstname>Joe</>    
    <lastname>Plumber</>
</>

乔
水暖工
它会更小,解析速度也会更快

假设没有边缘条件意味着这将不起作用-有没有库可以做这样的事情

这对谷歌来说是一件困难的事情,事实证明:

您的搜索-
-与任何 文件

建议:

尝试不同的关键字


编辑:我的问题似乎有点混乱。我在谈论我自己的压缩形式。我完全知道,目前这不是XML。服务器和客户端必须“参与方案”。这对于元素名很长的模式尤其有用,因为这些元素名占用的带宽将减半。

这不是有效的XML。必须命名结束标记。否则它可能会出错,坦白地说,我认为按照您的方式,它的可读性会降低

关于您对这是一种非标准违反XML标准以节省几个字节的澄清,出于以下几个原因,这是一个非常糟糕的想法:

  • 这是不标准的,可能在未来很长一段时间内必须得到支持
  • 标准的存在是有原因的。标准和惯例有很大的力量,“自定义XML”与象牙塔图形设计师齐头并进,他们强迫程序员编写自定义按钮替换,因为标准的XML不能做任何想象出来的奇怪、美妙和混乱的行为
  • Gzip压缩很简单,而且更有效,不会违反标准。如果您看到一个gzip八位组流,就不会把它误认为是XML。你所拥有的速记方案的真正问题是,它仍然在顶部,因此一些糟糕的、毫无戒心的解析器可能会错误地认为它是有效的,并以一个不同的、误导性的错误爆发出来
  • 信息论:压缩是通过消除信息的冗余来工作的。如果你用手去做,gzip压缩就不再有效,因为同样数量的信息被表示出来
  • 在将文档转换为此方案和从该方案转换文档时,会有很大的开销。这不能用标准的XML解析器来完成,因此您必须有效地编写自己的XML解析器和输出程序,以理解此方案(实际上,转换为这种格式可以用解析器来完成;取回它更困难),这是一项大量的工作(和许多bug)

  • 对不起,不在房间里。如果您有一个大的XML文件,最好通过zip、gzip等进行压缩

    如果需要更好的压缩和更简单的解析,可以尝试使用XML属性:

    <person firstname="Joe" lastname="Plumber" />
    

    您可能有兴趣了解不同的。例如,以下可能是有效的SGML:

    <p/This paragraph contains a <em/bold/ word./
    

    您没有使用YAML或JSON有什么原因吗?

    即使这是可能的,解析也只会花费更长的时间,因为现在解析器必须找出要关闭的内容,并且必须不断检查这是否正确


    如果你想压缩,XML是高度gzip的。

    是的,XML是一种很重的格式。但它有一定的优势

    如果您认为xml对您的使用来说过于繁重,那么可以看看JSON。它重量轻,但功能不如xml


    如果您想要非常小的文件,请使用二进制格式;-)

    如果您编写了一个压缩例程来实现这一点,那么是的,您可以压缩流并在另一端恢复它

    没有这样做的原因是:

    • 更好的XML不可知压缩方案已经存在(在压缩比方面,可能在CPU和空间方面——某个7 N UTF-8文档将获得14%的压缩,但至少需要2 N字节的空间进行解压缩,而不是大多数解压缩算法所需的恒定空间)
    • 已有更好的XML感知压缩方案(google“binary XML”)。对于模式感知压缩,基于ASN.1的方案比将用于指示元素类型的大小减少一半要好得多
    • 解压器必须解析非标准XML,并保留一堆它遇到的开放标记。因此,除非插入它而不是解析器,否则解析成本会翻一番。如果插入它而不是解析器,则会混合不同的层,这可能会在某个点上造成混乱

    如果数据的大小有任何问题,那么XML不适合您。

    正如您所说,这不是XML,那么为什么还要让它看起来像XML?您已经失去了使用任何XML解析器或工具的能力。我也会

    • 使用XML,并在线压缩它,因为您将看到比使用您自己的方案节省更多的成本
    • 使用另一种更紧凑的格式,如或

    如果不使用gzip或类似的东西,我只需在发送之前和在接收端使用xml之前用一个较短的标记名替换每个标记名。因此,您会得到如下结果:

    <a>
        <b>Joe</b>
        <c>Plumber</c>
    </a>
    
    
    乔
    水暖工
    

    使使用任何标准解析器迭代所有节点并相应地替换节点名称变得非常容易。

    不要为XML的文本内优化和降低读/写性能/简单性而烦恼。使用deflate压缩来压缩客户端和服务器之间的负载。我做了一些测试,压缩了一个普通的10k XML文件会导致2.5k blub。删除所有端点结束标记名称会将原始文件大小降低到9k,但一旦缩小,它将再次降低到2.5k。这是一个非常好的示例,基于字典的压缩是压缩端点之间有效负载的简单方法。“”和“”将(几乎)在压缩数据中使用相同的空间

    唯一的例外情况是,如果文件/数据非常小,则压缩程度较低
    have a stack.
    scan the XML, and output it, as-is.
    if you recognize an open tag, push its name.
    if you recognize close tag, pop to get its name, and
      insert that in the output (you can do this even when there is a proper close tag).
    
    <person>    
        <firstname>Joe</>    
        <lastname>Plumber