2012-08-22 3 views
0

많은 ListView가 있습니다. 17 번째 지점에있는 것이 무엇이든간에 항상 깨집니다 (ObjectDisposedException "닫힌 TextReader에서 읽을 수 없음"). 1에서 16까지는 물론 18에서 24까지 잘 작동합니다. x가 17에서 16으로 이동하면 다시 작동하지만 17 일에 새 휴식이 발생합니다. 내 코드는 특정 장소를 언급하지 않습니다.C# XMLReader 이상한 17 번째 위치가 닫힙니다. XMLReader 버그

는 XML 파일 형식

<Profiles> 
    <Profile name="a" type="A"> 
    <ListOne>1,2,3,4,5,6,7,8</ListOne> 
    <ListTwo>1,2,3,4,5,6,7,8</ListTwo> 
    </Profile> 
    <Profile name="b" type="B"> 
    ... 
    ... 
</Profiles> 

코드는 간단하다에게 다음과 같다. 나는 내가 관심이있는 프로필을 발견하고 하위 트리로

string CurrentProfile = ""; 
using (StreamReader SR = new StreamReader(MyXMLFilePath)) 
{ 
    XmlTextReader TR = new XmlTextReader(SR); 
    do 
    { 
    TR.ReadToFollowing("Profile"); 
    TR.MoveToFirstAttribute(); 
    CurrentName = TR.Value; 
    TR.MoveToNextAttribute(); 
    string CurrentType = TR.Value; 

    if (CurrentName == MyName && CurrentType == MyType) 
    { 
     TR.MoveToElement(); 
     XmlReader subtree = TR.ReadSubtree(); 
     return subtree; 
    } 
    } 
    while (CurrentName != ""); 
} 

을 반환하는 방법을 그리고 난 하위 트리에서 목록 1과 2를 꺼내서 방법이있다.

if(subtree != null) 
{ 
    subtree.ReadToFollowing("ListOne"); 
    subtree.Read(); 
    string[] ListOneArray = subtree.Value.Split(','); 

    subtree.ReadToFollowing("ListTwo"); 
    subtree.Read(); 
    string[] ListTwoArray = subtree.Value.Split(','); 
} 

여기에는 문제가 발생합니다. ObjectDisposedException 닫은 TextReader로부터 읽을 수 없습니다. subtree.ReadToFollowing ("ListTwo")하지만 XML 목록의 17 번째 프로필을 선택하는 경우에만 항상 중단됩니다. 나는 어느 시점에서든 내가 어떻게 문서 판독기를 닫고 있는지 보지 못한다. 또한 프로필 18, 19, 20 및 1 ~ 16에서 작동하지만 위치에 관계없이 항상 위치 17에서 중단됩니다. 17 번 지점이 다른 지점과 다른 점은 없습니다.

도와주세요.

답변

1

ReadSubTree() 여전히 기본 스트림에서 읽는 판독기를 반환합니다.
스트림에서 독자를 읽기 전에 스트림을 닫으므로 스트림이 작동하지 않습니다.

일반적으로 XmlReader의 전진 전용 모델은 작업하기에 다소 성가신 일입니다.
매우 큰 파일을 다루는 경우가 아니면 LINQ to XML을 사용해야합니다. 사용하는 것이 훨씬 쉽습니다.

+0

확인해 보겠습니다. 대부분의 프로필에서 항상 작동하는 이유는 알 수 있습니까?하지만 그 중 하나만 사용할 수는 없습니까? – xwiz

0

나는 개인적으로 사용 찾을 Linq2Xml 당신이 subtree을 닫는 XMLS

XDocument xDoc = XDocument.Load(...); 
var profiles = xDoc.Descendants("Profile") 
    .Where(x=>x.Attribute("name").Value=="a") 
    .Select(p => new 
    { 
     List1 = p.Element("ListOne").Value.Split(','), 
     List2 = p.Element("ListTwo").Value.Split(',') 
    }) 
    .ToList(); 
관련 문제