2010-06-24 58 views
5

我有一個程序從數據庫中的數據中生成Xml文件。在短代碼將執行以下操作:xml文件中的非法字符

string dsn = "a db connection string"; 
XmlDocument d = new XmlDocument(); 
using (SqlConnection con = new SqlConnection(dsn)) { 
    con.Open(); 
    string sql = "select id as Id, comment as Comment from Test where ... "; 
    using (SqlCommand cmd = new SqlCommand(sql, con)) { 
     DataSet ds = new DataSet("EXPORT"); 
     SqlDataAdapter da = new SqlDataAdapter(cmd); 
     da.Fill(ds, "Test"); 
     d.LoadXml(ds.GetXml()); 
    } 
} 
d.Save(@"c:\test.xml"); 

當我看一下XML文件包含無效字符&#X 1 A;

<EXPORT> 
    <Test> 
    <Id>2</Id> 
    <Comment> Keyboard NB&#x1A;5 linked</Comment> 
    </Test> 
</EXPORT> 

此xml文件不能被Firefox瀏覽器說無效字符開...

該實體在ISO 8859-1和CP1252保留,不應該被瀏覽器呈現。但是,爲什麼不能被解析爲有效的XmlDocument輸出XML - 抑或是隻是不能被瀏覽器解析或Excel中導入等等... 有沒有擺脫那個保留「的一個簡單的方法是有效的XML文檔無效字符'或編碼他們的方式,瀏覽器沒有問題呢?

你的意見非常感謝和TIPPS

+0

我已經有了與System.Data對象的各種XML方法完全相同的問題。我不確定這些方法會做什麼。他們的選擇是去除角色或拋出異常。 – 2011-11-15 14:56:20

回答

3

並非所有字符都可用XML表示。

在XML 1.0,沒有任何字符的具有小於0x20的值,可以使用除了TAB(0×09),LF(的0x0A)和CR(0X0D)。

在XML 1.1,只是除了NUL(0×00)什麼都可以使用。

如果你必須使用XML 1.1,接收程序支持XML 1.1(不是很多做)的選項,那麼你就可以逃脫0x1A的爲&#26;&#x1A;

將其包裝在CDATA也不是一個解決方案; CDATA只是一種方便的逃脫字符組,不同於標準的&機制。

否則,您需要在序列化之前將其刪除。

+0

很抱歉回答這個老問題很晚 - 我在序列化之前刪除了字符... Thx – 2010-10-28 08:55:42

0

這個答案看一看,看它是否幫助:

.NET DataSet.GetXml() - what's the default encoding?

+0

感謝您的tipp,但是我用ds.GetXml()得到的字符串在內部使用unicode(utf-16)我認爲在寫入文本文件而不改變編碼時應該可以嗎? – 2010-06-24 14:32:26

0

我還以爲你正在處理一個Control-Z(完文本文件)字符。這可能嗎?

+0

hm google說iso8859-1及其超集cp1252的「保留未使用」可能是文件標記的結尾......但DB中的內容對我來說是黑匣子,因此我無法過濾輸入到數據庫的乾淨輸入表... – 2010-06-24 14:21:18

1

從SQL數據創建/操作XML時,我已經遇到過幾次了。

但是爲什麼不能被解析爲有效的XmlDocument輸出XML - 抑或是隻是不能被瀏覽器解析或進口用Excel等

XmlDocument的沒有按一個有效的XML文檔」對您發送的數據執行任何驗證,它會將其留給您(開發人員)。這個XML文檔應該在使用XML幾乎每一件事情是無效的(但我可能是錯了......你總是可以測試它:P)

幾乎每一個我已經打了這個問題的時候,我結束了使用用正確的字符(如果有的話)替換違規的XML數據,或者只是刪除它。

你也可以嘗試把你的XML CDATA塊內,但將臃腫的文件一點點(不知道有多大整個文件會)

-1

確保逃生XML實體,如。 & => &amp; 否則,將數據包裝在CDATA中http://en.wikipedia.org/wiki/CDATA

+0

即使作爲實體,「」,它仍然無效。 – 2012-09-07 16:11:33

+0

有兩個問題。 1. XML和HTML實體是不同的東西。默認情況下,XML僅支持5個實體,其餘的可以由DTD定義。 是一個HTML實體,而不是XML實體。因此將不能在XML中工作,您需要將其編寫爲。問題2.如上面的答案建議,非打印字符不能插入到XML中。所以你需要逃脫到&#21;在它被XML解析之前。 – 2012-10-01 01:54:06