使用XmlReader如何在开始时重新启动?

时间:2013-10-10 17:48:19

标签: c# xml

这实际上是一个2部分问题......

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

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

  3. 这就是我创建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);
        }
    }
    

2 个答案:

答案 0 :(得分:7)

您无法将XmlReader对象重新启动到开头。根据微软的文档:

  

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

如果由于某种原因你确实需要回到开头,那么你应该使用XmlReader来加载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,请查看文档here

如果您不想使用XDocument并坚持XmlDocument,您也可以使用它(不带查询)来重新遍历XML文档。无论哪种方式,当你完成它时都不需要处理XmlDocument(或XDocument),因为它不是一次性物体。

答案 1 :(得分:2)

你使用XmlReader的方式毫无意义。将数据加载到XmlDocument后(XDocument会更好),使用XmlReader没有任何意义。

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