1. 程式人生 > >過濾XML檔案中的無效字元

過濾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
static String stripNonValidXMLCharacters(String in) {
    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特殊符號,右邊是轉義 <     &lt;>     &gt;&   &

XML檔案不允許出現的字元

一共有五個: 所有的特殊字元對應的編碼: 特殊字元 代替符號 特殊原因 & &amp;    每一個代表符號的開頭字元 > &gt;   標記的結束字元 <  &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中,特殊符號的轉義寫法如下: &lt; < &gt; > &lt;&gt; <> &amp; & &

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檔案時,>、<等符號是不能直接使用的,因此,我們需要進行特殊處理。下面介紹兩種處理方式: 第一種:使用特殊符號轉意的寫法   &lt;       &

Mybatis學習總結三之簡化sql對映xml檔案的引用及解決欄位名與實體類屬性名不相同的衝突

一、為實體類定義別名,簡化sql對映xml檔案中的引用 我們在sql對映xml檔案中的引用實體類時,需要寫上實體類的全類名(包名+類名),如下:parameterType="com.aiit.pojo.User"這裡寫的實體類User的全類名com.aiit.pojo.User, <i

ssmxml檔案自動提示

設定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

ideaapplicationContext-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