2016-02-25 61 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"?>