Оптимальный метод для минимизации XML в C # 3.0 - PullRequest
4 голосов
/ 19 сентября 2010

Платформа кодирования: 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>

Затем я конвертирую это в JSON, используя JSON Converter Джеймса Ньютона-Кинга .
Идея состоит в том, чтобы максимально сократить данные xml, так как они содержат десятки тысяч строк.

Мои вопросы

  1. Каков оптимальный метод минимизации xml, как упомянуто выше?
  2. Теперь все сделано как XML-MinifyXML-Convert to JSON.Могу ли я сделать это в два этапа? (XML-Minify при преобразовании в JSON)
  3. Является ли JSON-конвертер Джеймса Ньютона-Кинга немного излишним для этого простого преобразования?

Просьба также предоставить фрагменты кода, если это возможно.

1 Ответ

5 голосов
/ 19 сентября 2010

Я подозреваю, что 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);
...