2010-05-24 61 views
1

好吧,所以這是一種黑客...但它可能必須是。我正在XNA上編寫一個應用程序,從我對這個問題的研究中顯然不支持XML版本1.1。我正在閱讀ePub文檔的內容,其中一本新書將其內容編碼爲1.1版XML文檔。這導致我的程序崩潰,但是,結構與其餘部分相同。唯一讓它無法工作的是XmlDocument類中的硬編碼「1.0」。在XNA中通過StreamReader替換XML文件中的單詞?

是否有可能,我可以在文件中從流中讀取,看它是否包含:

<?xml version="1.1" encoding="UTF-8" standalone="no"?>

,並簡單地用「1.0」代替它?然後我可以把它作爲一個XmlDocument。我沒有寫任何文件或任何複雜的結構閱讀,只是尋找一些特定的節點,並拉入值,所以我不知道這會產生什麼後果。

+0

爲什麼不直接使用文本編輯器或使用正則表達式替換它? – 2010-05-24 23:47:55

+0

我其實剛剛瞭解到Regex今天,但我還沒有真正熟悉如何使用它。至於爲什麼不手動替換它,應用程序會自動將這些XML文件從ePub歸檔文件中提取出來,因此手動替換它並不是真正的選擇。 – kcoppock 2010-05-24 23:55:14

回答

2

你可以通過閱讀整個XML文件到內存中,並與它有自己的方式在一個非常狡猾的方式做到這一點:

string content = ""; 

// Read the XML file into content 
StreamReader reader = new StreamReader("file.xml"); 
content = reader.ReadToEnd(); 
reader.Close(); 

// Find the character position just after the <?xml token, and just before the ?> token 
int openIndex = content.IndexOf("<?xml", StringComparison.OrdinalIgnoreCase) + 5; 
int closeIndex = content.IndexOf("?>", openIndex); 

// Get the bits between <?xml and ?>  
string header = content.Substring(openIndex, closeIndex - openIndex); 

// Substitute version string. 
header = header.Replace("version=\"1.1\"", "version=\"1.0\""); 

// Put Humpty Dumpty back together again. 
content = string.Concat(content.Substring(0, openIndex), header, content.Substring(closeIndex)); 

// Feed content into an XMLReader (or equivalent) here. 

它爲您提供的字符串的話,但我沒有測試它在不完美格式化的XML文檔上。

+0

理論上它們都應該是完全格式化的XML文檔......但是,這就是爲什麼它被稱爲理論。 :) 你的方法工作,我可能只是實施檢查,看它是否發現1.1第1行,CHAR 16(這就是它拋出異常),如果是這樣,然後在其上運行此處理器。這絕對是一個狡猾的做法,我會確保在這樣做之前我找不到任何其他方式,哈哈。謝謝您的幫助! – kcoppock 2010-05-25 04:52:21