在C#3.0中简化XML的最佳方法

时间:2010-09-19 06:57:06

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

编码平台: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转换器有点矫枉过正吗?
  4. 如果可能,请提供代码段。

1 个答案:

答案 0 :(得分:5)

我怀疑GZIP(通过GZipStream,或者只是通过IIS,注意到你需要为json mime类型启用动态压缩)会更简单和更小,但如果你使用serializarion,只需添加一些[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);