2012-07-19 2 views
0

XMLReader/XMLTextReader 클래스에 정말 이상한 문제가 있습니다.XMLReader를 성공적으로 복제 할 수 없습니다 (예기치 않은 EOF)

public void First() 
{ 
    XmlTextReader reader = new XmlTextReader(@"C:\MyXMLFile.xml"); 
    XmlReader readerToSerialize; 
    XmlReader readerToLoad; 
    DuplicateReaders(reader, out readerToSerialize, out readerToLoad); 
    XmlSerializer serializer = new XmlSerializer(typeof(XMLTree)); 
    XmlFeed = (XMLDescriptor)serializer.Deserialize(readerToSerialize); 
    xmlDoc.Load(readerToLoad); 
} 
protected void DuplicateReaders(XmlTextReader xmlReader, out XmlReader cloneOne, out readerToLoad) 
{ 
    XmlDocument _XmlDocument = new XmlDocument(); 
    MemoryStream _Stream = new MemoryStream(); 
    _XmlDocument.Load((XmlTextReader)xmlReader); 
    _XmlDocument.Save(_Stream); 
    _Stream.Position = 0L; 
    cloneOne = XmlReader.Create(_Stream); 
    _Stream.Position = 0L; 
    cloneTwo = XmlReader.Create(_Stream); 
} 

문제는 (복제 된 요소의 하나가, 다음 하나 (xmlDoc.Load)이 같은 장소에 항상 실패 successully 전체 파일을 읽을 수 있다는 것입니다 라인 :

나는 간단한 파일로드가 91,이 xml 파일의 문자 37). 내가 직접 해당 xmldoc에 할당하는 경우 (즉, 한 번만 원래의 요소를 복제하고 기능에서 직접 asign) :

public void First() 
{ 
    XmlTextReader reader = new XmlTextReader(@"C:\MyXMLFile.xml"); 
    XmlReader readerToSerialize; 
    DuplicateReaders(reader, out readerToSerialize); 
    XmlSerializer serializer = new XmlSerializer(typeof(XMLTree)); 
    XmlFeed = (XMLDescriptor)serializer.Deserialize(readerToSerialize); 
} 
protected void DuplicateReaders(XmlTextReader xmlReader, out XmlReader cloneOne) 
{ 
    XmlDocument _XmlDocument = new XmlDocument(); 
    MemoryStream _Stream = new MemoryStream(); 
    _XmlDocument.Load((XmlTextReader)xmlReader); 
    _XmlDocument.Save(_Stream); 
    _Stream.Position = 0L; 
    cloneOne = XmlReader.Create(_Stream); 
    _Stream.Position = 0L; 
    this.xmlDoc.Load(_Stream); 
} 

나는 여전히 같은 오류 37분의 91 (예기치 않은 EOF)을 얻을 수 있지만, 시리얼이 시간 .

내 초기 문제는 xmlDoc.Load(reader)를 사용하는 경우 독자 인스턴스가 파괴 얻을 있었고, 난 나중에 직렬화 수 없습니다. MSDN 포럼에서 Duplicate 함수를 찾았지만 여전히 문제가 없습니다. 내가 달성하고자하는 것은 매우 간단하다 :

를 사용하여 하나의 리더와 하나 된 XmlDocument 하나의 직렬화 된 클래스를 돌려줍니다. 얼마나 힘들 수 있습니까?

답변

0

대신이 독자를 복제, 난 그냥 해당 xmldoc에서 두 번째를 만들어 사용하고 역 직렬화하는 데 사용합니다.

1

복제본을 사용하려면 먼저 첫 번째 판독기를 닫아야합니다.

reader.Close() 
+0

나는 그것을 복제 한 후 (그리고 실제로 복제본을 사용하기 전에) 독자를 닫지 만 여전히 "Unexpected EOF"를 얻는다. – Anonymous

+0

어떤 라인을 종료 하시겠습니까? –

+0

Duplicate 기능 바로 뒤에 메인 리더를 닫고 첫 번째 클론을 사용 직후에 닫습니다. 그러나 두 번째 클론은 EOF를 얻습니다. – Anonymous

1

두 개의 cloneOne과 복제본 모두 동일한 기본 메모리 스트림을 사용합니다.

사용하는 다른 MemoryStream을 훨씬 쉽게 해결책을 찾을 수

cloneTwo = XmlReader.Create(new MemoryStream(_Stream.ToArray())); 
관련 문제