2013-10-10 47 views
3

這的確是一個2部分的問題...使用XmlReader如何在開始時重新啓動?

  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); 
    } 
} 

回答

6

你不能重新啓動XmlReader對象開始。按照Microsoft的文檔:

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 
     } 
} 

如果你不familar與LINQ到XML的文檔here

看看如果你不想使用XDocument,堅持XmlDocument您也可以使用(無需查詢)重新遍歷XML文檔。無論哪種方式,雖然你不需要處理一個XmlDocument(或XDocument),當你完成它,因爲它不是一次性物品。

+0

所以要回答我的第二個問題,我不需要對XmlDocument做任何事情,但是需要使用MemoryStream正確地做些什麼?如果我將它封裝在using語句中並在using語句中創建XmlReader對象,那麼在using語句之外引用時XmlReader對象仍然可以正常使用嗎? –

+0

@JohnSaunders糾正。 – JNYRanger

+0

@ArvoBowen正確。但是@JohnSaunders提到你真的不需要使用'MemoryStream'。只需打開一個TextStream到你的XML文件,並將TextStream傳遞給'XDocument.Load(stream)'或'XmlDocument.Load(stream)'函數。這個負載應該在使用塊內。和範圍一樣,你不能在塊外引用流,但是你不需要這樣做,因爲你的'XmlDocument'或'XDocument'現在包含了你的XML的全部內容。 – JNYRanger

2

您使用XmlReader的方式沒有意義。一旦你有數據加載到XmlDocumentXDocument會更好),使用XmlReader是沒有意義的。

在.NET中,通常不需要在使用後銷燬對象 - 這就是垃圾收集器的用途。

+0

雖然你絕對正確,因爲垃圾收集通常不需要銷燬對象,但他確實詢問了「MemoryStream」和「XmlReader」對象。最好的做法是在使用後至少調用'.Close()',或者更好地使用''using'或者在使用'IDisposable'對象或流時嘗試,捕獲和最終結構。 – JNYRanger

+0

@JNYRanger:是的,但是如果他讓自己的代碼更加明智,它既不會使用XmlReader也不會使用MemoryStream,所以'using'不適用,這就是爲什麼我沒有提到它(與我慣常的做法相反)。 –

+0

Touche。他想在最初讀取XML數據的某個時刻使用流,所以這就是我提到它的原因。 – JNYRanger

相關問題