十进制表示必须紧跟在字符引用中的“&#”之后

A decimal representation must immediately follow the "&#" in a character reference

我正在通过 tika 获取 pdf 文档的内容并将其发送到 solr 以通过 coldfusion 9 中的 xml 请求对其进行索引 这是我的代码。

<cfset gatt = new getallthetexts.textextractor()>
<cfset result= gatt.read(pdfpath)>
<cfset content = xmlFormat(result.text)>
<!---escape unicode characters--->
<cfset p= createObject("java","java.util.regex.Pattern").compile("[^\u0009\u000A\u000D\u0020-\uD7FF\uE000-\uFFFD\u10000-\u10FFF]+")>
<cfset p.matcher(content).replaceAll("")>
<cfxml variable="xml">
 <add>
     <field name="content">#content#</field>
 </add>
</cfxml>

现在我面临以下错误:

A decimal representation must immediately follow the "&#" in a character reference.

我已经使用下面的示例 link 来获取 pdf 的内容: https://github.com/cfjedimaster/getallthetexts/blob/master/test1.cfm

谁能帮我解决这个问题。

符号 0xb 指的是 U+000B,这在 HTML 和 XML 1.0 中是被禁止的。在 Ascii 中,0xb 代表垂直制表。我根本不应该用在 HTML 或 XML 中。结论取决于此字符出现的上下文。

您的代码没有显示您随后对 content 执行的操作,这是关键位!

另外,您使用的是哪个版本的 ColdFusion?提问时一定要注明。

但无论如何,我可以对答案下赌注。

xmlFormat() 有错误(就像你看到的那样!),所以这不是这里的最佳选择,所以它没有声称根据你的问题清理低端字符。

这些都在文档 (xmlFormat()) 中,这应该是您遇到此类问题的第一站。

推荐的解决方案

ColdFusion 10 及更高版本

建议使用 encodeForXml(),它将正确处理此问题。

ColdFusion 9 及以下版本

使用 CF10 的 encodeFor~() 函数的基础 Java 库就足够简单了。都在这里:OWASP Java !Encoder Project。我最近不必使用这段代码,所以没有示例,但这一切看起来相当简单。试一试,如果您 运行 遇到麻烦:提出一个新问题:我会找时间仔细研究一下。

我正在按照亚当的建议更新我的答案。现在我已经使用 owasp 为 xml 编码文本。

我已经从以下link下载了最新版本的 OWASP jar 文件: https://www.owasp.org/index.php/OWASP_Java_Encoder_Project

我已经使用 javaloader 加载 jar 文件,这里是具有使用 OWASP 将文本解析为 XML 的功能的组件。

component {

    public function init() {
        variables.javaloader = new javaloader.JavaLoader().init([getDirectoryFromPath(getCurrentTemplatePath()) & 'encoder.jar'],true);
        return this;
    }   
    public function parseTextForXML(required string inputText) {
        esapi=variables.javaloader.create('org.owasp.esapi.ESAPI');
        esapiEncoder = esapi.encoder();
        return esapiEncoder.encodeForXML(inputText);
    }

}

并使用 CDATA 的功能解决了我的问题。这是代码:

<cfset gatt = new getallthetexts.textextractor()>
<cfset encoderObj = new encoder()>
<cfset result= gatt.read(pdfpath)>
<cfset content = encoderObj.parseTextForXML(result.text)>
<cfxml variable="xml">
 <add>
     <field name="content"><![CDATA[#content#]]></field>
 </add>
</cfxml>