2011-08-28 36 views
0

,這是有問題的代碼:爲什麼不能從字符串中讀取XML? (但將來自同一數據的.txt)的

using (var file = MemoryMappedFile.OpenExisting("AIDA64_SensorValues")) 
{ 
    using (var readerz = file.CreateViewAccessor(0, 0)) 
    { 
     var bytes = new byte[567]; 
     var encoding = Encoding.ASCII; 
     readerz.ReadArray<byte>(0, bytes, 0, bytes.Length); 

     File.WriteAllText("C:\\myFile.txt", encoding.GetString(bytes)); 

     var readerSettings = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment }; 
     using (var reader = XmlReader.Create("C:\\myFile.txt", readerSettings)) 
     { 

這是myfile.txt的樣子:

<sys><id>SCPUCLK</id><label>CPU Clock</label><value>1598</value></sys><sys><id>SCPUFSB</id><label>CPU FSB</label><value>266</value></sys><sys><id>SMEMSPEED</id><label>Memory Speed</label><value>DDR2-667</value></sys><sys><id>SFREEMEM</id><label>Free Memory</label><value>415</value></sys><sys><id>SGPU1CLK</id><label>GPU Clock</label><value>562</value></sys><sys><id>SFREELVMEM</id><label>Free Local Video Memory</label><value>229</value></sys><temp><id>TCPU</id><label>CPU</label><value>42</value></temp><temp><id>TGPU1</id><label>GPU</label><value>58</value></temp> 

如果我的數據寫入到一個txt與硬盤驅動器上的文件:

File.WriteAllText("C:\\myFile.txt", encoding.GetString(bytes)); 

然後讀取與片段的XmlReader是同一個文本文件:

XmlReader.Create("C:\\myFile.txt"); 

它讀取它只是罰款,程序運行並完成像它應該,但後來如果我直接與片段的XmlReader念想:

XmlReader.Create(encoding.GetString(bytes)); 

我得到異常,當運行「路徑非法字符「在XmlReader.Create行。

我試着先將它寫入一個單獨的字符串,然後用xmlreader讀取它,並且它不會幫助將它打印到CMD以查看它的樣子,因爲CMD不會顯示處理正確的無效字符?

但哦,我沒有Console.WriteLine(encoding.GetString(bytes));並精確匹配的txt文件。

所以不知怎麼寫到文本文件是刪除一些「非法字符」?你們有什麼感想?

回答

7
XmlReader.Create(encoding.GetString(bytes)); 

XmlReader.Create()將您的字符串解釋爲應從中讀取文件的URI。相反封裝的字節在StringReader

StringReader sr = new StringReader(encoding.GetString(bytes)); 
XmlReader.Create(sr); 
+0

真棒,工作很好,謝謝!你有最好的答案!但你們所有人都表示感謝! – Csharpz

5

這裏:

XmlReader.Create(encoding.GetString(bytes)); 

你只是調用following method這需要代表文件名的字符串。但是,您將實際的XML字符串傳遞給它,這顯然是無效的文件名。

如果你想從一個緩衝區,你可以use a stream加載讀者:

byte[] bytes = ... represents the XML bytes 
using (var stream = new MemoryStream(bytes)) 
using (var reader = XmlReader.Create(stream)) 
{ 
    ... 
} 
+0

感謝您的幫助,但我得到了「流不存在於當前的情況下」一個字符串閱讀器更好地工作:) – Csharpz

+0

@Csharpz,添加'使用System.IO;'到您的文件的頂部爲了將名稱空間帶入定義了'MemoryStream'類。 –

+0

啊我以前.IO在之前我刪除它,因爲我沒有使用它後襬脫寫入文件代碼。哪個更快(程序運行速度)?你的方法還是我選擇的答案? – Csharpz

3

的方法XmlReader.Create()與作爲參數需要一個string一個URI傳遞,而不是XML文檔作爲字符串,請參考MSDN。它試圖打開一個名爲「< ...」的文件,這是一個無效的URI。您可以改爲傳遞流。

相關問題