小蛙的工作常常需要做一些資料庫匯出成 XML 格式,以 XML 達到交換資料的目的,上星期匯出的時候發現 java.io.IOException: The character ‘ ‘ is an invalid XML character 這個 Exception,發生錯誤的檔案因為這個特殊字元導致 XML 匯出不完整,上網查了一些解決辦法記錄在這篇文章中。

一開始發生這個例外的時候,並沒有發現匯出的 XML 檔案是不完整的,直到最近再次處理相同資料要給同事進 Solr 的時候才發現這個問題,在 Stack Overflow 看到這篇文章,才知道其實要做到驗證字元是否合法的方法, Xerces 套件裡面早已經有了,以下方法來自該篇文章:

/* from http://stackoverflow.com/questions/93655/stripping-invalid-xml-characters-in-java */
public static String stripInvalidXmlCharacters(String input) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < input.length(); i++) {
        char c = input.charAt(i);
        if (XMLChar.isValid(c)) {
            sb.append(c);
        }
    }
    return sb.toString();
}

只要新增以上方法,透過 Xerces 中的 XMLChar.charAt(int); 方法就可以驗證該傳入的字元是否合法!
附帶一提,在 Xerces 之前的版本,只需要用到 xerces.jar 就可以了,在比較新的版本似乎要載入以下 JAR 檔:resolver.jar, serializer.jar, xercesImpl.jar, xml-apis.jar。

參考資料:

  1. The Apache XercesTM Project
    http://xerces.apache.org/
  2. The character ‘’ is an invalid XML character exception getting while export data in XML file @ XML forum at JavaRanch
    http://www.coderanch.com/t/477874/XML/character-invalid-XML-character-exception
  3. Stripping Invalid XML characters in Java @ Stack Overflow
    http://stackoverflow.com/questions/93655/stripping-invalid-xml-characters-in-java
  4. 使用SAX處理XML檔案 @ [email protected]
    http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=492

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *