0

我有一个包含一堆东西的 ListView。第 17 个位置的任何内容总是中断(ObjectDisposedException“无法从关闭的 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

你在哪里关闭subtree?根据 MSDN 文档,只是想知道最佳实践是否可能是subtree在代码中的某处显式关闭 XmlReader。

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

于 2012-08-22T15:41:03.560 回答
0

我个人发现在使用 xmls 时使用 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 回答