编码平台: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 数据,因为它包含数万行。
我的问题是
- 如上所述,缩小 xml 的最佳方法是什么?
- 现在它像 XML-MinifyXML-Convert to JSON 一样完成了。我可以分两步完成吗?(转换为 JSON 时 XML-Minify)
- James Newton-King 的 JSON 转换器对于这种简单的转换是否有点矫枉过正?
如果可能,请同时提供代码片段。
最佳答案
我怀疑 GZIP(通过 GZipStream,或简单地通过 IIS,注意你需要为 json mime 类型启用动态压缩)会更简单和更小,但如果你使用序列化,只需添加一些 [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);
关于c# - 在 C# 3.0 中缩小 XML 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3744804/