要加载具有任意的编码的XML文件我有以下代码:

Encoding encoding;
using (var reader = new XmlTextReader(filepath))
{
    reader.MoveToContent();
encoding = reader.Encoding;
}

var settings = new XmlReaderSettings { NameTable = new NameTable() };
var xmlns = new XmlNamespaceManager(settings.NameTable);
var context = new XmlParserContext(null, xmlns, "", XmlSpace.Default, 
    encoding);
using (var reader = XmlReader.Create(filepath, settings, context))
{
    return XElement.Load(reader);
}

这工作,但似乎有点低效打开文件的两倍。有没有更好的方法来检测编码,这样我可以做的:

 1. Open file
 2. Detect encoding
 3. Read XML into an XElement
 4. Close file
有帮助吗?

解决方案

好吧,我应该已经想到了这点。两者的XmlTextReader(其为我们提供了编码)和XmlReader.Create(其允许我们指定编码)接受的流。因此,如何第一开口一个FileStream,然后使用此两者的XmlTextReader和的XmlReader,如下所示:

using (var txtreader = new FileStream(filepath, FileMode.Open))
{
    using (var xmlreader = new XmlTextReader(txtreader))
    {
        // Read in the encoding info
        xmlreader.MoveToContent();
        var encoding = xmlreader.Encoding;

        // Rewind to the beginning
        txtreader.Seek(0, SeekOrigin.Begin);

        var settings = new XmlReaderSettings { NameTable = new NameTable() };
        var xmlns = new XmlNamespaceManager(settings.NameTable);
        var context = new XmlParserContext(null, xmlns, "", XmlSpace.Default,
                 encoding);

        using (var reader = XmlReader.Create(txtreader, settings, context))
        {
            return XElement.Load(reader);
        }
    }
}

这就像一个魅力。阅读在编码独立的方式XML文件应该更优雅,但至少我越来越远,只有一个文件打开。

其他提示

另一种选择,很简单,是使用LINQ到XML。 Load方法自动读取从XML文件的编码。然后,您可以通过使用 XDeclaration获得编码器值.Encoding 财产。 从MSDN的示例:

// Create the document
XDocument encodedDoc16 = new XDocument(
new XDeclaration("1.0", "utf-16", "yes"),
new XElement("Root", "Content")
);
encodedDoc16.Save("EncodedUtf16.xml");
Console.WriteLine("Encoding is:{0}", encodedDoc16.Declaration.Encoding);
Console.WriteLine();

// Read the document
XDocument newDoc16 = XDocument.Load("EncodedUtf16.xml");
Console.WriteLine("Encoded document:");
Console.WriteLine(File.ReadAllText("EncodedUtf16.xml"));
Console.WriteLine();
Console.WriteLine("Encoding of loaded document is:{0}", newDoc16.Declaration.Encoding);

虽然这可能不是服务器的原始海报,因为他将不得不重构大量的代码,这是谁的人有编写新的代码为他们的项目,或者如果他们认为重构是值得的,有益的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top