我的应用程序从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,但没有结果。为什么这样工作?
答案 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