合并几个 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,但最终文件中的数据已损坏。例如,我没有符号 å .我试图找出这个问题的原因,阅读乔尔关于编码的文章,但没有结果。为什么它以这种方式工作?
当您像这样创建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"));