0

たくさんのものを持つ ListView があります。17 番目の場所にあるものはすべて壊れます (ObjectDisposedException "Cannot read from a closed TextReader")。1 から 16 だけでなく 18 から 24 も問題なく動作します。x を 17 番目から 16 番目に移動すると、再び機能しますが、新しい 17 番目が壊れます。私のコードは特定の場所を参照していません。

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 番目のスポットが他のスポットとどのように違うのかわかりません。

助けてください!

4

3 に答える 3

1

ReadSubTree()基になるストリームから引き続き読み取りを行うリーダーを返します。
そのリーダーから読み取る前にストリームを閉じるため、機能しません。

一般に、XmlReader の転送専用モデルは、操作がやや面倒です。
非常に大きなファイルを扱っている場合を除き、代わりに LINQ to XML を使用する必要があります。はるかに使いやすいです。

于 2012-08-22T15:07:16.727 に答える
0

個人的には、xml を扱うときは Linq2Xml を使用する方がはるかに簡単だと思います

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();
于 2012-08-22T15:38:29.670 に答える
0

どこで閉じていsubtreeますか?MSDN のドキュメントに基づいてsubtree、コードのどこかで XmlReader を明示的に閉じることがベスト プラクティスであるかどうか疑問に思っています。

http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.readsubtree.aspx

于 2012-08-22T15:41:03.560 に答える