어떻게 최고의 감지 인코딩에서는 XML 파일입니까?
-
10-07-2019 - |
문제
을 로드하는 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 가 가치가있다.
제휴하지 않습니다 StackOverflow