Frage

Um XML-Dateien mit beliebigen Codierung laden Ich habe den folgenden Code:

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);
}

Dies funktioniert, aber es scheint ein wenig ineffizient die Datei zweimal zu öffnen. Gibt es einen besseren Weg, um die Codierung so zu erfassen, dass ich tun kann:

 1. Open file
 2. Detect encoding
 3. Read XML into an XElement
 4. Close file
War es hilfreich?

Lösung

Ok, ich dachte, dieser früher haben. Beide XmlTextReader (was uns die Codierung gibt) und XmlReader.Create (die uns Codierung angeben können) nimmt einen Stream. Wie wäre es also zunächst ein Filestream öffnen und diese dann verwenden beide mit XmlTextReader und XmlReader, wie folgt aus:

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);
        }
    }
}

Das funktioniert wie ein Charme. Lesen von XML-Dateien in einer Codierung unabhängige Art und Weise sollte nur eine Datei mit eleganter, aber zumindest ich bin immer weg gewesen offen.

Andere Tipps

Eine weitere Möglichkeit, ganz einfach, ist Linq to XML verwenden. Die Load-Methode liest automatisch die Codierung aus der XML-Datei. Anschließend können Sie den Geberwert erhalten, indem Sie die XDeclaration .Encoding Eigenschaft. Ein Beispiel aus 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);

Während dies kann nicht Server das ursprüngliche Plakat, als er eine Menge Code Refactoring hätte, es ist nützlich für jemanden, der neue Code für ihr Projekt schreiben muss, oder wenn sie denken, dass Refactoring ist es wert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top