6

这真的是一个两部分的问题......

  1. 我有一个从内存流创建的 XmlReader 对象。我已经使用了几次 .Read() 方法,现在我想回到开头并从声明节点重新开始。我怎样才能做到这一点?

  2. 创建 XmlReader 对象时,我创建了一个 XmlDocument 对象和一个 MemoryStream 对象。在使用内存流创建 XmlReader 之后,是否需要以某种方式销毁这些对象?或者销毁它们也会影响 XmlReader 对象?

这就是我创建 XmlReader 对象的方式

XmlReader xmlReader = null;
XmlDocument doc = new XmlDocument();
doc.Load(m_sXMLPath);

if (doc.FirstChild.NodeType == XmlNodeType.XmlDeclaration)
{
    XmlDeclaration dec = null;
    byte[] bytes = null;
    MemoryStream ms = null;

    dec = (XmlDeclaration)doc.FirstChild;
    switch (dec.Encoding.ToLower())
    {
        case "utf-8":
            bytes = Encoding.UTF8.GetBytes(File.ReadAllText(m_sXMLPath));
            break;
        case "utf-16":
            bytes = Encoding.Unicode.GetBytes(File.ReadAllText(m_sXMLPath));
            break;
        default:
            throw new XmlException("");
    }

    if (bytes != null)
    {
        ms = new MemoryStream(bytes);
        xmlReader = XmlReader.Create(ms);
    }
}
4

2 回答 2

11

您不能重新开始您的XmlReader对象。根据微软的文档:

XmlReader 提供对 XML 数据流的只进、只读访问。XmlReader 类符合 W3C 可扩展标记语言 (XML) 1.0 和 XML 中的命名空间建议。 http://msdn.microsoft.com/en-us/library/System.Xml.XmlReader.aspx

如果由于某种原因您确实需要回到开头,则应该使用 yourXmlReader来加载XDocument对象。然后,您可以使用该XDocument对象来查询 XML 的任何部分。此外,您应该将基于 Stream 的对象包装在一个using块中,这样您就不必担心破坏。下面的例子:

XDocument myXmlDoc;
using(MemoryStream ms = new MemoryStream(bytes))
{
     using(XmlReader xmlReader = XmlReader.Create(ms))
     {
           myXmlDoc = XDocument.Load(xmlReader);

           //query your XDocument here to your heart's desire here in any order you want
      }
 }

如果您不熟悉 LINQ to XML,请查看此处的文档

如果您不想使用XDocument并坚持XmlDocument使用,也可以使用它(无需查询)重新遍历您的 XML 文档。无论哪种方式,尽管您在完成后不需要处理XmlDocument(or XDocument),因为它不是一次性对象。

于 2013-10-10T19:34:31.690 回答
2

您使用 XmlReader 的方式毫无意义。将数据加载到XmlDocument(XDocument会更好) 后,使用XmlReader.

在 .NET 中,通常不需要在使用后销毁对象——这就是垃圾收集器的用途。

于 2013-10-10T21:33:18.963 回答