gpt4 book ai didi

java - 来自 Servlet 的字符串,带有 XML CDATA 中的控制字符

转载 作者:行者123 更新时间:2023-11-30 09:47:56 26 4
gpt4 key购买 nike

我的问题类似于Why are "control" characters illegal in XML 1.0? - 但是我正在寻找以下问题的解决方案,而不是为什么 XML 规范不允许 XML 中的控制字符。

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

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

Error: not well-formed
Location:

<![CDATA[

有没有一种方法可以处理 Java 字符串以使其“XML 安全”?特别是放在 CDATA 部分时要保证安全?

我希望我的问题很清楚!

提前致谢,拉吉

最佳答案

使此 XML 安全的唯一合规方法是添加您自己的编码。

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

  • 将所有数据存储为文本数据,并用某种 unicode 转义机制(XML 本身定义的机制除外!)替换所有禁止使用的字符。例如,您可以使用 Java 使用的代码:\u0001 表示 U+0001。
  • 将数据存储为二进制数据并使用base64BinaryhexBinary以 XML 格式存储您的数据。

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

如果删除所有non-transferable characters是合适的,那么这个正则表达式应该可以解决问题:

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("");

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

关于java - 来自 Servlet 的字符串,带有 XML CDATA 中的控制字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6490048/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com