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

时间:2016-07-13 18:15:08

标签: c# xml encoding utf-8

我的应用程序从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 ,但最终文件中的数据已损坏。例如,我没有符号å,而是 。我试图找出这个问题的原因,阅读Joel's article about encodings,但没有结果。为什么这样工作?

1 个答案:

答案 0 :(得分:2)

当你像这样创建$id=$request->get('id'); 时:

XmlReader

然后将从XML声明中推断出文件的编码,因此XmlReader.Create("path/to/file.xml") 。这显然是正确的。

当你像这样创建iso-8859-1时:

XmlReader

您正在使用占用XmlReader.Create(new StreamReader("path/to/file.xml")) 的重载。 TextReader返回unicode,因此TextReader无法解码。结果是声明中指定的编码完全被忽略。这在the docs中提到:

  

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

如果你想这样做,你需要为XmlReader指定正确的编码,因为它没有正确检测到这一点:

StreamReader