代码之家  ›  专栏  ›  技术社区  ›  codeandcloud

C#3.0中XML的优化缩小方法

  •  4
  • codeandcloud  · 技术社区  · 14 年前

    我有这样一个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 .
    其思想是将xml数据缩小到最大值,因为它包含数万行。

    我的问题是

    1. 上面提到的缩小xml的最佳方法是什么?
    2. 现在它像XML MinifyXML一样转换成JSON。我能分两步做吗?(转换为JSON时XML缩小)

    1 回复  |  直到 14 年前
        1
  •  5
  •   Marc Gravell    14 年前

    如果您不使用序列化,那么这看起来非常适合某些“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>
    

    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);