这实际上是一个2部分问题......
我有一个从内存流创建的XmlReader对象。我已经使用了几次.Read()方法,现在我想回到开头并从声明节点开始。我怎么能这样做?
创建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);
}
}
答案 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中,通常不需要在使用后销毁对象 - 这就是垃圾收集器的用途。