문제

을 로드하는 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 (인코딩을 지정할 수 있음)는 스트림을 허용합니다. 따라서 먼저 파일 스트림을 열고 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.부하는 방법을 자동으로 읽어 인코딩에서는 xml 파일입니다.다음 얻을 수 있는 값을 인코더를 사용하여 를 사용하여 xdeclaration.인코딩 을 제공합니다.예제에서 사용됩니다.

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

이 되지 않을 수도 있지만 서버 시스로서 그는 형식의 많은 코드,유용한 사람을 새 코드 작성을 위해 자신의 프로젝트는 경우,또는 그들이 생각하는 refactoring 가 가치가있다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top