编码平台: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数据缩小到最大值,因为它包含数万行。
我的问题是
如果可能,请提供代码段。
答案 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);