2

我的问题类似于为什么 XML 1.0 中的“控制”字符是非法的?- 但是我正在寻找解决以下问题的方法,而不是为什么 XML 规范不允许 XML 中的控制字符。

我有一个 servlet,它根据用户请求打印一个包含 XML 的字符串。一个特定元素包含一个 CDATA 部分,该部分需要包含一些用户输入文本。

现在碰巧在一种特殊情况下,我们的用户输入包含字符 U+0001(控制字符)。即使我将字符集指定为 UTF-8,servlet 也会引发错误:

Error: not well-formed
Location: 

<![CDATA[ 

有没有办法可以处理 Java 字符串以使其“XML 安全”?特别是,在放入 CDATA 部分时使其安全?

我希望我的问题很清楚!

在此先感谢,拉吉

4

1 回答 1

2

使这种 XML 安全的唯一符合方法是添加您自己的编码。

你可以做这两个之一(例如):

  • 将所有数据存储为文本数据,并用某种 unicode-escape 机制替换所有禁止字符(XML 本身定义的机制除外!)。例如,您可以使用 Java 使用的那个:\u0001U+0001。或者
  • 将数据存储为二进制数据,并使用hexBinary的base64Binary将数据存储在 XML 中。

这两种方法都需要消费者生产者的明确支持。第二种方法的优点是使用具有广泛支持的定义明确的数据类型,但如果您的内容实际上是文本,则需要指定(或传达)字节流中使用的编码(否则 XML 本身会否定这一必要性) )。

如果删除所有不可转移的字符是合适的,那么这个正则表达式应该可以解决问题:

Pattern XML_INVALID_CHARS = Pattern.compile("[^\u0009\n\r\u0020-\uD7FF\uE000-\uFFFD\uD800\uDC00-\uDBFF\uDFFF ]+");
String xmlSafe = XML_INVALID_CHARS.matcher(input).replaceAll("");

请注意,规范建议文档作者对注释中允许的字符集更加严格。那个正则表达式会更长一点。

于 2011-06-27T08:06:27.597 回答