2011-04-26 2 views
1

.Net Framework 3.5 및 System.Xml.XmlReader 클래스에 비정상적인 문제가 발생했습니다.XmlReader.Read 및 Stream.Read의 이상한 동작

응용 프로그램이 XmlReader.Read 메서드를 호출하기 전에 먼저 Stream.Read 메서드를 사용하여 로깅 목적으로 스트림 내용을 읽습니다. 그런 다음 Stream.Read를 호출하기 전에 스트림의 시작 부분을 찾습니다. 나는이 작업을 수행 할 때 나는 다음과 같은 오류가 점점 오전 : 그러나 나는 XmlReader.Read를 호출하면

Unhandled Exception: System.Xml.XmlException: Unexpected end of file while parsing Name has occurred. Line 1, position 4097. 

, 모든 것이 잘 작동 Stream.Read 메서드를 호출 한 후 스트림의 시작을 추구합니다. 그러나 이것은 단지 큰 물줄기에서 일어나는 것처럼 보입니다. 방금 2000 자 정도의 시스템을 살펴 보았는데 제대로 작동합니까?

아래 코드 샘플을 포함하여 내가하는 일에 대한 아이디어를 제공했습니다.

XmlReaderSettings readerSettings = new XmlReaderSettings(); 
readerSettings.Schemas.Add(null, args[1]); 
readerSettings.ValidationType = ValidationType.Schema; 
readerSettings.ValidationEventHandler += new ValidationEventHandler(XmlValidatingReaderValidationEventHandler); 

XmlReader reader = XmlReader.Create(fileReader, readerSettings); 

byte[] buffer = new byte[fs.Length]; 
fs.Read(buffer, 0, buffer.Length); 
string content = System.Text.UTF8Encoding.UTF8.GetString(buffer, 0, buffer.Length); 
fs.Seek(0, SeekOrigin.Begin); 

while(reader.Read()); 

Console.WriteLine("Done"); 

감사

XmlReaderStream에서 데이터를 버퍼링 때문이다

답변

0

. XmlReader처럼 뭔가를 백업하는 스트림과 장난 Stream의 현재 위치, 너무 XmlReader와 엉망 ...

+0

고마워요. 스트림을 읽은 다음 시작으로 돌아가는 것이 이렇게 엉망이 되더라도 이상합니다. 동일한 결과를 가진 메모리 스트림을 사용하여 다른 작업을 수행했습니다. 나는 C++에서 비슷한 것을했는데 그 전에는 잘 돌아갔다. –

1

와 당신이 엉망이되면은 일반적으로 나쁜 생각입니다. 동일한 파일로 두 가지 다른 작업을 수행하려는 경우 두 개의 다른 스트림을 여는 것이 좋습니다. 그렇게하면 서로 간섭하지 않을 것입니다.

File.ReadAllText을 사용하면 텍스트 파일의 내용을 문자열로로드하는 더 간단한 방법입니다.

+0

실제로, 실제 응용 프로그램은 파일 작업을하지 않으므로 내가 수행 한 작업을 복사했습니다. 무작위로 포인터를 찾았다면이 동작을 기대할 수 있습니다. 그러나 처음에는 큰 스트림으로 돌아가는 것처럼 이상하게 들립니다. –

+0

@ daz-fuller : 처음부터 다시 돌려 주겠지 만 당신은 이미 그것이 무엇을했는지 모른다. 예를 들어, 바이트 순서 마크를 읽으면 인코딩을 감지 할 수 있습니다. 그럼 당신은 그것을 처음부터 다시 시작하고 BOM은 다시 혼란 스러울 것입니다 ... –

+0

@ jon-skeet 그게 좋은 지적 이네요, –