過濾XML檔案中的無效字元
按:
軟體還是得測試啊~這不,測出XML中的無效字元0xffee了,結果導致無法解析XML,程式崩潰……
新浪微博,你是如何儲存亂碼又用顯示的啊???
找了半天,終於找到java下的一個解決方案,很容易轉成C#。
最近在處理XML檔案時遇到一個問題,即由於自己寫程式生成的XML檔案中包含了一些不可見的無效字元,導致JDom在解析該檔案是丟擲異常。
這裡的無效字元不是指<,>等不能出現在XML檔案的標籤以外的字元,也不是由於編碼問題引起的亂碼,而是一些超出XML合法字元範圍的不可見字元。查了一下W3C中對XML 1.0的定義[1],其Unicode的合法字元範圍是:
Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]/* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */
為了保證常用XML解析工具能將自己生成的XML檔案成功解析,就需要先將檔案中的無效字元過濾掉,或在生成XML檔案時就對字元的有效性進行判斷,拋棄無效字元。
下面是我在網上看到的一種使用Java來過濾XML非法字元的方法[2]:
/*** This method ensures that the output String has only valid XML unicode
* characters as specified by the XML 1.0 standard. For reference, please
* see <a href="http://www.w3.org/TR/2000/REC-xml-20001006#NT-Char">the
* standard</a>. This method will return an empty String if the input is
* null or empty.
*
* @param in
* The String whose non-valid characters we want to remove.
* @return The in String, stripped of non-valid characters.
*/
public
StringBuffer out = new StringBuffer(); // Used to hold the output.
char current; // Used to reference the current character.
if (in == null || ("".equals(in)))
return ""; // vacancy test.
for (int i = 0; i < in.length(); i++) {
current = in.charAt(i); // NOTE: No IndexOutOfBoundsException caught
// here; it should not happen.
if ((current == 0x9) || (current == 0xA) || (current == 0xD)
|| ((current >= 0x20) && (current <= 0xD7FF))
|| ((current >= 0xE000) && (current <= 0xFFFD))
|| ((current >= 0x10000) && (current <= 0x10FFFF)))
out.append(current);
}
return out.toString();
}
實際上就是將字串中的每個字元進行有效性判斷,再將有效字元重新構建成一個新的字串返回。
其實,使用一些XML工具包來生成XML 檔案一般都能避免寫入無效字元,不過靈活性上就不如自己用程式生成了。
另外,一直讓我困惑的是,我所見到的XML工具包都是先將所有資料在記憶體中生成整個DOM物件,再全部寫入檔案,讀取時也是先將整個XML檔案讀入記憶體,生成DOM物件,再進行解析。但是如果XML檔案很大,記憶體裝不下的話,這種方法豈不是不能用了?
不知是否是因為我孤陋寡聞,沒有找到好的工具,還是由於XML本來就被設計為用來儲存便於網路傳輸的少量資料的,因而沒有考慮大檔案的解析方法。
參考資料:
[1] http://www.w3.org/TR/2000/REC-xml-20001006
[2] http://cse-mjmcl.cse.bris.ac.uk/blog/2007/02/14/1171465494443.html
相關推薦
過濾XML檔案中的無效字元
按: 軟體還是得測試啊~這不,測出XML中的無效字元0xffee了,結果導致無法解析XML,程式崩潰…… 新浪微博,你是如何儲存亂碼又用顯示的啊??? 找了半天,終於找到java下的一個解決方案,很容易轉成C#。 最近在處理XML檔案時遇到一個問題,即由於自己寫程式生成的
xml檔案中特殊字元轉義
在使用mybatis/ibatis寫sql時總是忘記特殊轉義表示,在此記錄 左邊為xml特殊符號,右邊是轉義 < <> >& &
XML檔案中不允許出現的字元
一共有五個: 所有的特殊字元對應的編碼: 特殊字元 代替符號 特殊原因 & & 每一個代表符號的開頭字元 > > 標記的結束字元 < &a
解析XML檔案時,無效的XML 字元 (Unicode: 0x7)異常處理
報錯資訊: 2015-01-29 00:10:22,075 ERROR commonapi.CommonApiAction - errorCode:5000,5000-00;Description:程式異常。Error on line 1 of document :
linux統計一個檔案中特定字元的個數
統計一個檔案中某個字串的個數,其實就是在在一塊沙地裡面找石頭,有的人看到石頭以後,在上面做個標記(grep),然後記住自己做了多少個標記;有的人看到石頭以後,把它挖了(tr),最後統計自己挖了多少石頭;有的人看到石頭以後,把它跳過去(awk),然後統計自己跳了多少次。這是我用的的檔案 [[
mybatis xml檔案中的大於、小於、及like模糊查詢的寫法
在xml中,特殊符號的轉義寫法如下: < < > > <> <> & & &
mybatis學習筆記之——mybatis的Mapper XML檔案中select元素
select元素: Select元素用來定義查詢操作,常用屬性如下。 id:唯一識別符號。用來引用這條語句,需要和介面的方法名一致。 parameterType:將會傳入這條語句的引數類的完全限定名或別名。這個屬性是可選的,因為 MyBatis 可以通過 TypeHandler 推斷出具
mybatis學習筆記之——mybatis的Mapper XML檔案中resultMap屬性
resultMap resultMap:自定義結果集對映規則,自定義某個JavaBean的封裝規則。 id:唯一id,方便引用。 type:自定義規則的Java類。 具體其他屬性詳細資訊和配置程式碼如下: <resultMap id="MyEmp" type="com.te
Mybatis的mapper.xml檔案中插入資料返回自增主鍵
使用MyBatis往MySQL資料庫中插入一條記錄後,返回該條記錄的自增主鍵值。Mapper檔案應該怎麼寫呢? Mybatis的Mapper的標籤中有一個屬性,我們一起來看看: useGenerateKeys這個屬性,意思就是使用自增。我們需要將這個欄位設定為 true 。 同時,還需
Java:使用DOM4j來實現讀寫XML檔案中的屬性和元素
DOM4可以讀取和新增XML檔案的屬性或者元素 讀取屬性: public static void ReadAttributes() throws DocumentException { File file = new File("D:\\cmz\\java\\XMLTest\\Custom
MyBatis xml檔案中的大於、小於等符號寫法
在SQL中我們經常會使用到比較的情況,然而在使用Mybatis中XML檔案時,>、<等符號是不能直接使用的,因此,我們需要進行特殊處理。下面介紹兩種處理方式: 第一種:使用特殊符號轉意的寫法 < &
Mybatis學習總結三之簡化sql對映xml檔案中的引用及解決欄位名與實體類屬性名不相同的衝突
一、為實體類定義別名,簡化sql對映xml檔案中的引用 我們在sql對映xml檔案中的引用實體類時,需要寫上實體類的全類名(包名+類名),如下:parameterType="com.aiit.pojo.User"這裡寫的實體類User的全類名com.aiit.pojo.User, <i
ssm中xml檔案中自動提示
設定xml 檔案的程式碼提示功能 開啟Eclipse 依次選擇Window > Preferences > Xml > Editor > Content Assist > Auto activation >&nb
android開發時,xml檔案中總是提示某一個錯誤,修改後仍然提示。
哎,剛開始學android開發,開發環境好不容易搭建好,自己寫程式碼的時候難免犯錯,特別是xml編寫時如果出現了程式碼錯誤,錯誤提示會一直存在,即使修改了也存在,關掉專案重新開啟也存在,關掉Eclipse 重新啟動還存在。。。。糾結了 有沒有
將資料庫查詢資料封裝到XML檔案中,進行格式化處理,並進行加密操作,和解密操作
1.pom檔案 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7&l
idea中applicationContext-dao.xml檔案中Cannot resolve file***** :spring xml model validation問題
訪問不了classpath下的資料夾中的檔案 解決辦法如下:(問題出在我建立的resources資料夾是一個普通的資料夾) 1、本來是普通的資料夾 2、ctrl+shift+alt+s開啟如下介面: 3、點選Test Resources 4、apply-->OK&n
boost::filesystem獲取目錄下的所有.xml檔名,並批量更改.xml檔案中的內容。
第一步,遍歷資料夾並獲取所有.xml檔名,並存入files列表。 #include <boost/filesystem.hpp> namespace fs = boost::filesystem; int get_filenames(const std::s
當在寫android的xml檔案中出現Unexpected text found in layout file: """的解決辦法
#當在寫android的xml檔案中出現Unexpected text found in layout file: “”"的解決辦法 當出現 Unexpected text found in layout file: “”" Incorrect line e
mybaitis 的 mapper.xml 檔案中 引數為List集合SQL 的寫法。
1、應用場景: 傳參: MaterialCodeList, activity_end_time,userCode 具體SQl: <if test> 的驗證: "MaterialCodeList != null and MaterialCodeList.size()>0"
tomcat 設定server.xml檔案中的UrIEncoding編碼
問題:專案中有一個封裝好的日期控制元件,當觸發該事件的離開事件是時,會通過ajax將頁面的值傳到後臺,後臺接收值時發生亂碼。 解決:本地 tomcat ---》conf---》server.xml檔案 原檔案: <Connector connectionTim