xml 的特殊字符的處理方法
遇到這一方面的問題是因?yàn)槲以噲D把一個(gè)對(duì)象序列化之后存貯到xml文件中,然后從xml文件中讀取字符串,并反序列化對(duì)象(hadoop mapreduce程序中通過JobConf向tasktracker傳送對(duì)象)。
有關(guān)序列化:
當(dāng)我把序列化之后的數(shù)據(jù)直接存在xml中后,在解析xml時(shí)遇到解析錯(cuò)誤,原因是有非法字符。在詳細(xì)閱讀xml的說明之后才發(fā)現(xiàn):< > ' " &是不允許作為xml的PCDATA的。要使用這幾個(gè)字符,必須要把他們替換為內(nèi)建實(shí)體:
實(shí)體引用 字符
< <
> >
& &
" "
' '
所以,最直接的方法就是自己控制,在寫入xml文件時(shí)把特殊字符轉(zhuǎn)為實(shí)體引用,在讀取的時(shí)候,再轉(zhuǎn)回來。當(dāng)然還有另外一個(gè)方法就是不把字符串當(dāng)PCDATA,而是當(dāng)成CDATA來使用(沒有測(cè)試)。
用實(shí)體引用的方法太麻煩,而我的應(yīng)用xml的格式不能自己規(guī)定,所以只好尋找另外的方法:BASE64編碼。這是一種常用在網(wǎng)絡(luò)傳輸數(shù)據(jù)的編碼方式。把存在這些非法字符的字符編碼成base64編碼,就不會(huì)有這些字符了。最重要的是java api中提供了這種編碼的編碼器和解碼器,位于sun.misc的BASE64Encoder和BASE64Decoder。這樣就可以把序列化之后得到的字節(jié)流轉(zhuǎn)化成字符串了。并且也可以存貯在xml文件中。
不過這兩個(gè)類并不是sun的開放api,編譯會(huì)有警告。
相關(guān)文章
java常見報(bào)錯(cuò):Array?Out?of?Bounds兩種解決辦法
這篇文章主要給大家介紹了關(guān)于java報(bào)錯(cuò)Array?Out?of?Bounds的兩種解決辦法,Array out of bounds錯(cuò)誤表示你嘗試訪問數(shù)組中不存在的索引,即索引小于零或者大于等于數(shù)組的大小,文中通過代碼將解決的辦法介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08
Java計(jì)算程序代碼執(zhí)行時(shí)間的方法小結(jié)
這篇文章主要介紹了Java計(jì)算程序代碼執(zhí)行時(shí)間的方法,結(jié)合實(shí)例形式總結(jié)分析了java采用毫秒數(shù)及納秒數(shù)計(jì)算程序運(yùn)行時(shí)間的相關(guān)操作技巧,需要的朋友可以參考下2017-11-11
JDK1.7 Paths,Files類實(shí)現(xiàn)文件夾的復(fù)制與刪除的實(shí)例
下面小編就為大家分享一篇JDK1.7 Paths,Files類實(shí)現(xiàn)文件夾的復(fù)制與刪除的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。以前跟隨小編過來看看吧2017-11-11
手動(dòng)編譯并運(yùn)行Java項(xiàng)目實(shí)現(xiàn)過程解析
這篇文章主要介紹了手動(dòng)編譯并運(yùn)行Java項(xiàng)目實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
springboot中使用Feign整合nacos,gateway進(jìn)行微服務(wù)之間的調(diào)用方法
這篇文章主要介紹了springboot中使用Feign整合nacos,gateway進(jìn)行微服務(wù)之間的調(diào)用方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03
springboot~ObjectMapper~dto到entity的自動(dòng)賦值
這篇文章主要介紹了springboot~ObjectMapper~dto到entity的自動(dòng)賦值,本文分三種情況給大家介紹,需要的朋友可以參考下2018-08-08
java selenium教程環(huán)境搭建基于Maven
本文主要介紹Java selenium 環(huán)境的安裝,這里介紹了基于Maven的環(huán)境搭建,有需要的小伙伴可以參考下2016-08-08

