【问题标题】:Optimal Method to Minify an XML in C# 3.0在 C# 3.0 中缩小 XML 的最佳方法
【发布时间】:2011-04-14 06:35:08
【问题描述】:

编码平台:ASP.NET C#

我有一个这样的 XML。

<Items>
    <Map id="35">
        <Terrains>
            <Item id="1" row="0" column="0"/>
            <Item id="1" row="0" column="1"/>
            <Item id="1" row="0" column="2"/>
            <Item id="1" row="0" column="3"/>
            <Item id="1" row="0" column="4"/>
        </Terrains>
    </Map>
</Items>

我想把它缩小到

<Its>
    <Map id="30">
        <Te>
            <It id="1" r="0" c="0"/>
            <It id="1" r="0" c="1"/>
            <It id="1" r="0" c="2"/>
            <It id="1" r="0" c="3"/>
            <It id="1" r="0" c="4"/>
        </Te>
    </Map>
</Its>

然后我使用 James Newton-King's JSON Converter 将其转换为 JSON。
这个想法是将 xml 数据最小化到最大,因为它包含数万行。

我的问题是

  1. 如上所述缩小 xml 的最佳方法是什么?
  2. 现在它像 XML-MinifyXML-Convert to JSON 一样完成。我可以分两步完成吗?(在转换为 JSON 时进行 XML-Minify)
  3. James Newton-King 的 JSON 转换器对于这个简单的转换来说是不是有点矫枉过正?

如果可能,请提供代码 sn-ps。

【问题讨论】:

  • -1:这不是在模仿 XML,因为它改变了语义(JavaScript 缩小可能会改变本地人的名称,但它们不会在这些函数之外使用)。缩小 XML 是为了避免重复长的命名空间标签,消除不重要的空白等等。
  • @Richard:那我应该怎么称呼它?包装?
  • “使用较短的标识符”,XML 的任何消费者都需要能够提取数据,因此它需要知道节点名称。因此转换将被固定。
  • XML 文档应该易于阅读且相当清晰,XML 标记中的简洁性并不重要
  • @Caspar:我不同意简洁总是的重要性。它是一种很好的交换格式,但与所涉及系统的处理能力相比,有时要交换的数据量很大。

标签: c# asp.net xml json linq-to-xml


【解决方案1】:

我怀疑 GZIP(通过 GZipStream 或简单地通过 IIS,注意您需要为 json mime 类型启用动态压缩)会更简单且更小,但如果您使用的是序列化,只需添加一些 [XmlElement( ...)] / [XmlAttribute(...)] 应该这样做。当然,如果您关心大小,我是否也可以推荐类似 protobuf-net 之类的东西,它可以提供极其密集的二进制输出。

如果您不使用序列化,那么这看起来非常适合某些“xslt”:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="@* | node()">
    <xsl:copy><xsl:apply-templates select="@* | node()"/></xsl:copy>
  </xsl:template>
  <xsl:template match="/Items">
    <Its><xsl:apply-templates/></Its>
  </xsl:template>
  <xsl:template match="/Items/Map/Terrains">
    <Te><xsl:apply-templates/></Te>
  </xsl:template>
  <xsl:template match="/Items/Map/Terrains/Item">
    <It id="{@id}" r="{@row}" c="{@column}"><xsl:apply-templates select="*"/></It>
  </xsl:template>
</xsl:stylesheet>

(使用 C#:)

XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load("Condense.xslt"); // cache and re-use this object; don't Load each time
xslt.Transform("Data.xml", "Smaller.xml");

 Console.WriteLine("{0} vs {1}",
    new FileInfo("Data.xml").Length,
    new FileInfo("Smaller.xml").Length);

【讨论】:

  • 谢谢。但是我从 SWF 和 .NET 部分获取这个 XML 作为输入是为了缩小(或者更确切地说是打包)xml n 然后转换为 json 以便大小更小。我将 JSON 保存在另一个位置,以便另一个 SWF 访问它。
  • @naveen - xslt 路由,然后(添加示例)
  • @naveen 你可以使用 LINQ-XML,但是 xslt 很方便(设计用于)转换 XML。
  • 感谢 sn-p。我真的提到了这一点。
猜你喜欢
  • 2012-10-29
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
相关资源
最近更新 更多