2016-02-25 63 views
1

在處理與XSLT的XML,我碰到下面的錯誤,但我看不出在XML無效的XML字符:XSLT錯誤在處理XML

Character reference "&#16" is an invalid XML character. 
Character reference "&#4" is an invalid XML character. 
Character reference "&#4" is an invalid XML character. 
Character reference "&#18" is an invalid XML character. 
Character reference "&#1" is an invalid XML character. 
Character reference "&#2" is an invalid XML character. 
Character reference "&#25" is an invalid XML character. 

請告知這些字符。

xml由具有utf 8字符編碼的csv文本文件構成。

回答

2

&#之後是十進制格式的ASCII碼(&#x將指定十六進制格式的代碼)。這些代碼,16,4,18等沒有指定任何可打印的字符,但它們是通常在文本編輯器中默認不可見的控制字符。這些字符或實際字節在XML中是不允許的(很少例外),所以你的XML是無效的。

CSV文件可能包含這些非法字節,並且XML沒有任何形式的內容驗證(即CSV文件的內容已被逐字節複製到XML)。

這裏有一些選擇:

  • 檢查,如果你XSLT處理器可以被配置爲忽略這些非法字節。
  • 用一些低級別的數據處理器自己清理這些字符,這些數據處理器只讀取字節並從中刪除所有非法的字符。
  • 如果csv-to-xml轉換受您控制,請修復該問題以生成有效的XML。
  • 如果它是某個第三方應用程序,則應向供應商索要修復程序。
  • 使用其他工具從CSV文件創建XML。
+0

非常感謝您的意見。你有什麼建議來刪除這些控制字符嗎? – Hari

+0

@Hari我已經在我的答案中列出了一些選項供您考慮。 – xjuice

+0

我已經使用java代碼來刪除控制字符。非常感謝您的支持 – Hari

1

這些是控制字符。不允許控制Unicode範圍之外的字符和字符。這也意味着禁止調用例如字符實體

XML recommendation 1.0, §2.2 Characters

允許的字符的全局列表是:

[2]字符:: =#X9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]/*任何Unicode字符,不包括代理塊,FFFE和FFFF。 */

1

這些是non-printable ASCII control codes在ASCII表中從0到1到31的十進制數。它們在文本編輯器中不可見,所以你看不到它們。如果您可以將編輯器切換爲十六進制模式,則可以找到類似於04h = 4,12h = 18d的值,以及正常UTF-8(或其他)編碼旁邊的值,例如'A'的41h,'B'的42h 」。

所以擺脫它們的最簡單的方法是使用一個工具來過濾掉它們。使用Linux,你可以使用the approach described here

1

這些字符引用在XML 1.1中是合法的,但在XML 1.0中是不合法的。檢查您正在使用的XML解析器是否支持XML 1.1,以及文件頂部的XML聲明是否指定<?xml version="1.1"?>