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

Two XML files. Roughly same number of lines. One is twice the size of the other. How?

我一直在使用 Access 和 VBA 生成 XML 站点地图。我要求我们的开发人员实施一个服务器端解决方案,这样就可以 运行 每晚都不需要我记得去做。

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

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

当他第一次向我展示这个时,我以为他从站点地图中遗漏了很多数据。当我检查每行的行数时,只有 38 行差异(在大约 22,500 行文本中)。

怎么会这样?

不确定这是否是 post 这个正确的 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>
    ...

两个文件几乎完全相同,但 的顺序不同,一个比另一个多 36 行。

编辑 2

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

编辑 3

由于即将关闭,这里是两者的代码

我的VB一个

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....

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

(Unicode 表示(在 Windows 中)UTF-16)。