Я подозреваю, что GZIP (через GZipStream или просто через IIS, отмечая, что вам нужно включить динамическое сжатие для mime-типа json) будет проще и меньше, но если вы используете 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);