合并几个 xml 文件:编码问题

本文关键字:文件 编码 问题 xml 几个 合并 | 更新日期: 2023-09-27 17:56:53

我的应用程序从Web服务中获取一些XML文件,如下所示:

<?xml version="1.0" encoding="iso-8859-1"?> 
<root> 
    <person> 
    <!— some elements here —> 
    </person> 
    <person> 
    <!— some elements here —> 
    </person> 
</root>

我将所有这些文件合并到一个文件中,以将所有人加入一个根元素下。如果我使用这样的代码:

var readers = files.Select(XmlReader.Create).ToList(); 
var writer = XmlWriter.Create("final.xml"); 
... 
writer.WriteStartDocument(); 
writer.WriteStartElement("root"); 
foreach (var reader in readers) 
{ 
    reader.MoveToContent(); 
    reader.Read(); 
    while (!reader.EOF) 
    { 
        string elementName = reader.Name; 
        if (elementName.Equals("person", StringComparison.OrdinalIgnoreCase)) 
        { 
            writer.WriteNode(reader, false); 
        } 
        else 
        { 
            reader.Read(); 
        } 
    } 
} 
writer.WriteEndElement(); 
writer.WriteEndDocument(); 
... 
//dispose all readers and writers

它工作正常,在最终文件中,我在 xml prolouge 中有 utf-8。但是如果我创建这样的阅读器:

var readers = files.Select(x => XmlReader.Create(new StreamReader(x))).ToList();

我在 xml prolouge 中使用相同的 utf-8,但最终文件中的数据已损坏。例如,我没有符号 å .我试图找出这个问题的原因,阅读乔尔关于编码的文章,但没有结果。为什么它以这种方式工作?

合并几个 xml 文件:编码问题

当您像这样创建XmlReader时:

XmlReader.Create("path/to/file.xml")

然后文件的编码将从XML声明中推断出来,所以iso-8859-1. 这显然是正确的。

当您像这样创建XmlReader时:

XmlReader.Create(new StreamReader("path/to/file.xml"))

您正在使用需要TextReader的重载。 TextReader返回 unicode,因此 XmlReader 无需进行解码。结果是完全忽略声明中指定的编码。 文档中提到了这一点:

文本读取器返回 Unicode 字符流,因此 XML 读取器不使用 XML 声明中指定的编码来解码数据流。

如果要这样做,则需要为StreamReader指定正确的编码,因为它无法正确检测到这一点:

new StreamReader("path/to/file.xml", Encoding.GetEncoding("iso-8859-1"));