2009-11-14 120 views
3

是否有任何類爲ascii轉換成XML字符集優選OPENSOURCE我將使用這個類無論是在VC++或C#ASCII到XML的字符集轉換

我的ASCII有一些可打印的字符,其是不存在於XML字符集

我只是試圖仙一份簡歷是在設置ASCII字符,我試圖將其存儲在在線CRM,我得到這個錯誤消息

javax.xml.bind.UnmarshalException - 帶鏈接的異常: [javax.xml.stream.XMLStreamException:ParseError在[行,列]:[50,22] 消息:字符引用「&#X13」是無效的XML字符]

在此先感謝

+0

請問您的ASCII字符集包括非打印字符? – 2009-11-14 06:56:28

+0

你的意思是像'<'到'<'? – Elisha 2009-11-14 06:58:22

+0

你能舉一個你期待的轉換的例子嗎? – 2009-11-14 06:59:06

回答

6

您的文字將不會有任何打印字符,這是不是在XML提供 - 但它可能有一些不可打印字符其不在XML提供。

尤其是,Unicode值U + 0000到U + 001F是無效的,除了標籤。回車和換行。如果你真的需要其他控制角色,你必須爲他們創建自己的轉義形式,並在另一端嘲笑他們。

+1

我的答案給出瞭如何處理這個問題的代碼,如果你有興趣。 http://stackoverflow.com/questions/1733544/ascii-to-xml-character-set-conversion/9987636#9987636 – MikeTeeVee 2012-04-03 06:52:13

2

出於好奇,我花了幾分鐘的時間在C#中編寫一個簡單的例程,以抽出128個ASCII字符的XML字符串,令我驚訝的是,.NET沒有輸出真正有效的XML文檔。我想我輸出元素文本的方式並不完全正確。反正這裏是代碼(註釋歡迎):

XmlDocument doc = new XmlDocument(); 
doc.AppendChild(doc.CreateXmlDeclaration("1.0", "us-ascii", "")); 
XmlElement elem = doc.CreateElement("ASCII"); 
doc.AppendChild(elem); 
byte[] b = new byte[1]; 
for (int i = 0; i < 128; i++) 
{ 
    b[0] = Convert.ToByte(i); 
    XmlElement e = doc.CreateElement("ASCII_" + i.ToString().PadLeft(3,'0')); 
    e.InnerText = System.Text.ASCIIEncoding.ASCII.GetString(b); 
    elem.AppendChild(e); 
} 
Console.WriteLine(doc.OuterXml); 

這裏是格式化輸出:

<?xml version="1.0" encoding="us-ascii" ?> 
    <ASCII> 
    <ASCII_000>&#x0;</ASCII_000> 
    <ASCII_001>&#x1;</ASCII_001> 
    <ASCII_002>&#x2;</ASCII_002> 
    <ASCII_003>&#x3;</ASCII_003> 
    <ASCII_004>&#x4;</ASCII_004> 
    <ASCII_005>&#x5;</ASCII_005> 
    <ASCII_006>&#x6;</ASCII_006> 
    <ASCII_007>&#x7;</ASCII_007> 
    <ASCII_008>&#x8;</ASCII_008> 
    <ASCII_009> </ASCII_009> 
    <ASCII_010> 
    </ASCII_010> 
    <ASCII_011>&#xB;</ASCII_011> 
    <ASCII_012>&#xC;</ASCII_012> 
    <ASCII_013> 
    </ASCII_013> 
    <ASCII_014>&#xE;</ASCII_014> 
    <ASCII_015>&#xF;</ASCII_015> 
    <ASCII_016>&#x10;</ASCII_016> 
    <ASCII_017>&#x11;</ASCII_017> 
    <ASCII_018>&#x12;</ASCII_018> 
    <ASCII_019>&#x13;</ASCII_019> 
    <ASCII_020>&#x14;</ASCII_020> 
    <ASCII_021>&#x15;</ASCII_021> 
    <ASCII_022>&#x16;</ASCII_022> 
    <ASCII_023>&#x17;</ASCII_023> 
    <ASCII_024>&#x18;</ASCII_024> 
    <ASCII_025>&#x19;</ASCII_025> 
    <ASCII_026>&#x1A;</ASCII_026> 
    <ASCII_027>&#x1B;</ASCII_027> 
    <ASCII_028>&#x1C;</ASCII_028> 
    <ASCII_029>&#x1D;</ASCII_029> 
    <ASCII_030>&#x1E;</ASCII_030> 
    <ASCII_031>&#x1F;</ASCII_031> 
    <ASCII_032> </ASCII_032> 
    <ASCII_033>!</ASCII_033> 
    <ASCII_034>"</ASCII_034> 
    <ASCII_035>#</ASCII_035> 
    <ASCII_036>$</ASCII_036> 
    <ASCII_037>%</ASCII_037> 
    <ASCII_038>&amp;</ASCII_038> 
    <ASCII_039>'</ASCII_039> 
    <ASCII_040>(</ASCII_040> 
    <ASCII_041>)</ASCII_041> 
    <ASCII_042>*</ASCII_042> 
    <ASCII_043>+</ASCII_043> 
    <ASCII_044>,</ASCII_044> 
    <ASCII_045>-</ASCII_045> 
    <ASCII_046>.</ASCII_046> 
    <ASCII_047>/</ASCII_047> 
    <ASCII_048>0</ASCII_048> 
    <ASCII_049>1</ASCII_049> 
    <ASCII_050>2</ASCII_050> 
    <ASCII_051>3</ASCII_051> 
    <ASCII_052>4</ASCII_052> 
    <ASCII_053>5</ASCII_053> 
    <ASCII_054>6</ASCII_054> 
    <ASCII_055>7</ASCII_055> 
    <ASCII_056>8</ASCII_056> 
    <ASCII_057>9</ASCII_057> 
    <ASCII_058>:</ASCII_058> 
    <ASCII_059>;</ASCII_059> 
    <ASCII_060>&lt;</ASCII_060> 
    <ASCII_061>=</ASCII_061> 
    <ASCII_062>&gt;</ASCII_062> 
    <ASCII_063>?</ASCII_063> 
    <ASCII_064>@</ASCII_064> 
    <ASCII_065>A</ASCII_065> 
    <ASCII_066>B</ASCII_066> 
    <ASCII_067>C</ASCII_067> 
    <ASCII_068>D</ASCII_068> 
    <ASCII_069>E</ASCII_069> 
    <ASCII_070>F</ASCII_070> 
    <ASCII_071>G</ASCII_071> 
    <ASCII_072>H</ASCII_072> 
    <ASCII_073>I</ASCII_073> 
    <ASCII_074>J</ASCII_074> 
    <ASCII_075>K</ASCII_075> 
    <ASCII_076>L</ASCII_076> 
    <ASCII_077>M</ASCII_077> 
    <ASCII_078>N</ASCII_078> 
    <ASCII_079>O</ASCII_079> 
    <ASCII_080>P</ASCII_080> 
    <ASCII_081>Q</ASCII_081> 
    <ASCII_082>R</ASCII_082> 
    <ASCII_083>S</ASCII_083> 
    <ASCII_084>T</ASCII_084> 
    <ASCII_085>U</ASCII_085> 
    <ASCII_086>V</ASCII_086> 
    <ASCII_087>W</ASCII_087> 
    <ASCII_088>X</ASCII_088> 
    <ASCII_089>Y</ASCII_089> 
    <ASCII_090>Z</ASCII_090> 
    <ASCII_091>[</ASCII_091> 
    <ASCII_092>\</ASCII_092> 
    <ASCII_093>]</ASCII_093> 
    <ASCII_094>^</ASCII_094> 
    <ASCII_095>_</ASCII_095> 
    <ASCII_096>`</ASCII_096> 
    <ASCII_097>a</ASCII_097> 
    <ASCII_098>b</ASCII_098> 
    <ASCII_099>c</ASCII_099> 
    <ASCII_100>d</ASCII_100> 
    <ASCII_101>e</ASCII_101> 
    <ASCII_102>f</ASCII_102> 
    <ASCII_103>g</ASCII_103> 
    <ASCII_104>h</ASCII_104> 
    <ASCII_105>i</ASCII_105> 
    <ASCII_106>j</ASCII_106> 
    <ASCII_107>k</ASCII_107> 
    <ASCII_108>l</ASCII_108> 
    <ASCII_109>m</ASCII_109> 
    <ASCII_110>n</ASCII_110> 
    <ASCII_111>o</ASCII_111> 
    <ASCII_112>p</ASCII_112> 
    <ASCII_113>q</ASCII_113> 
    <ASCII_114>r</ASCII_114> 
    <ASCII_115>s</ASCII_115> 
    <ASCII_116>t</ASCII_116> 
    <ASCII_117>u</ASCII_117> 
    <ASCII_118>v</ASCII_118> 
    <ASCII_119>w</ASCII_119> 
    <ASCII_120>x</ASCII_120> 
    <ASCII_121>y</ASCII_121> 
    <ASCII_122>z</ASCII_122> 
    <ASCII_123>{</ASCII_123> 
    <ASCII_124>|</ASCII_124> 
    <ASCII_125>}</ASCII_125> 
    <ASCII_126>~</ASCII_126> 
    <ASCII_127></ASCII_127> 
</ASCII> 

更新:
添加 「US-ASCII」 XML decalration編碼

0

你不需要額外的庫來做到這一點。從不同的編碼到嵌入式二進制數據,所有這些都可以通過常用的.net庫來實現。你能舉一個簡單的例子嗎?

8

我在使用C#中的OpenXML文檔創建的Excel中遇到了同樣的問題。
構建具有錯誤的ASCII字符的文檔時,我的Excel導出功能會爆炸。
不知何故,在我公司的數據庫中,字符串數據中有時髦的字符。
儘管我從OpenXML SDK 2中使用了Microsoft DocumentFormat.OpenXML程序集。0,當使用它們的對象分配字符串值時,它仍然沒有考慮到這一點。

解決方法:

t.Text = Regex.Replace(sValue, @"[\x00-\x08]|[\x0B\x0C]|[\x0E-\x19]|[\uD800-\uDFFF]|[\uFFFE\uFFFF]", "?"); 

這通過去除有問題的字符和一個問號替換它們清理S值的字符串。你可以用任何字符串替換或者只使用一個空字符串。

XML Spec允許0x09(TAB),0x0A(LF - 換行或NL - 換行)和0x0D(CR - 回車)。上面的RegEx注意不要刪除這些。

XML 1.1規範允許您轉義其中的一些字符。
例如:使用&#x03;對於0x03在HTML文件中顯示爲,在Office文檔和記事本中顯示爲L
我使用Asp.net,這在我的GridView中被自動處理,所以我不需要替換這些值 - 但我相信它可能是瀏覽器照顧它的所有我知道的。

我想在OpenXML中轉義這些值,但是當我查看輸出時,它顯示了退出標記。所以邁克&#x03; TeeVee仍然顯示爲邁克&#x03; TeeVee在Excel中而不是像邁克 TeeVee或邁克L TeeVee。這就是爲什麼我更喜歡Mike?TeeVee的方法。

我的預感是,這是目前OpenXML中的一個錯誤,它編碼允許的XML ASCII字符,但允許不支持的ASCII字符透漏。

UPDATE:

我忘了,我可以查找這些字符是如何使用「的Open XML SDK 2.0生產力工具」看到裏面的文檔,如Excel中顯示。
在那裏,我發現它使用的格式:_ X0000 _

記住:XML 1.0不支持轉義這些值,但是XML 1.1呢,所以如果你使用1.1,那麼你可以使用這個代碼來逃避他們。

常規XML 1.1轉義:

t.Text = Regex.Replace(s, @"[\x00-\x08]|[\x0B\x0C]|[\x0E-\x19]|[\uD800-\uDFFF]|[\uFFFE\uFFFF]", 
     delegate(Match m) 
     { 
      return (byte)(m.Value[0]) == 0 //0x00 is not Supported in 1.0 or 1.1 
        ? "" 
        : ("&#x" + string.Format("{0:00}", (byte)(m.Value[0])) + ";"); 
     }); 


如果你逃避字符串處理OpenXML,然後用這個來代替:

t.Text = Regex.Replace(s, @"[\x00-\x08]|[\x0B\x0C]|[\x0E-\x19]|[\uD800-\uDFFF]|[\uFFFE\uFFFF]", 
     delegate(Match m) 
     { 
      return (byte)(m.Value[0]) == 0 //0x00 is not Supported in 1.0 or 1.1 
        ? "" 
        : ("_x" + string.Format("{0:0000}", (byte)(m.Value[0])) + "_"); 
     });