两个XML文件。大致相同的行数。一个是另一个的两倍。如何?

时间:2015-06-11 13:43:09

标签: xml vb.net vba file-io filesize

我一直在使用Access和VBA生成XML站点地图。我让我们的开发人员实现了一个服务器端解决方案,这样它就可以每晚运行而不必记住这样做。

我通过将文本写入文件来生成文件。非常简单。我的文件大约是1800KB。

开发人员的解决方案将文本写入文件(使用XmlWriter VB类)。他的文件大约是900KB。

当他第一次向我展示这一点时,我认为他错过了站点地图中的大量数据。当我检查每行中的行数时,只有38行差异(大约22,500行文本)。

这怎么可能?

不确定这是否是正确的stackexchange网站发布,但我不是更合适的。

修改

以下是文件

的示例
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>http://www.bodykind.com/index.aspx</loc>
    </url>
    <url>
        <loc>http://www.bodykind.com/category/3-Supplements.aspx</loc>
    </url>
    <url>
        <loc>http://www.bodykind.com/category/4-Wellbeing.aspx</loc>
    </url>
    ...

两个文件几乎完全相同,但&lt; url&gt;是一个不同的顺序,一个比另一个多36个。

编辑2

我刚检查了文档属性。似乎900KB文件的代码集是UTF-8,但1800KB文件的代码集是Unicode。我假设这就是为什么会有这么大的差异?

编辑3

由于它即将被关闭,这里是两个代码

我的VBA

Private Sub Class_Initialize()
    pIndent = True
    Set objADO = CreateObject("ADODB.Stream")
    objADO.Type = 2
    objADO.Charset = "utf-8"
    objADO.LineSeparator = 10
    objADO.Open
    objADO.WriteText "<?xml version=""1.0"" encoding=""UTF-8""?>", 1
End Sub

... some code which writes the text to the file

Public Sub SaveToFile(ByVal PATH As String)
    ' Skip the BOM
    objADO.Position = 3

    Dim BinaryStream As Object
    Set BinaryStream = CreateObject("ADODB.stream")
    BinaryStream.Type = 1
    BinaryStream.Mode = adModeReadWrite
    BinaryStream.Open

    'Strips BOM (first 3 bytes)
    objADO.CopyTo BinaryStream
    objADO.flush
    objADO.Close

    BinaryStream.SaveToFile PATH, 2
    BinaryStream.flush
    BinaryStream.Close

    Set BinaryStream = Nothing
    Set objADO = Nothing
End Sub

开发人员解决方案

Using writer As New XmlTextWriter(Server.MapPath(filename), Encoding.UTF8)
    writer.WriteStartDocument()
    writer.WriteStartElement("urlset")
    writer.WriteAttributeString("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9")
    writer.Formatting = Formatting.Indented

    writer.WriteStartElement("url")
    writer.WriteElementString("loc", domain + "/index.aspx")
    writer.WriteEndElement()

    writer.WriteStartElement("url")
    writer.WriteElementString("loc", domain + "/aboutus.aspx")
    writer.WriteEndElement()

    ... and so on....

1 个答案:

答案 0 :(得分:2)

如果它是两倍大小,则一个是UTF-8(较小的一个),一个是UTF-16(较大的一个)。在UTF-16中,每个ASCII字符占用的空间是UTF-8的两倍。

(而Unicode意味着(在Windows中)UTF-16)。