十进制表示必须紧跟在字符引用

时间:2015-11-30 18:07:21

标签: xml unicode solr coldfusion coldfusion-9

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

<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中的“&amp;#”后面   字符参考。

我在以下链接中使用了示例来获取pdf的内容: https://github.com/cfjedimaster/getallthetexts/blob/master/test1.cfm

任何人都可以帮我解决这个问题。

3 个答案:

答案 0 :(得分:1)

符号0xb表示U + 000B,在HTML和XML 1.0中禁止使用。在Ascii中,0xb代表VERTICAL TABULATION。我根本不应该使用HTML或XML。结论取决于这个角色出现的背景。

答案 1 :(得分:1)

您的代码未显示您使用content执行的操作,这是关键位!

您使用的是哪个版本的ColdFusion?当你提出问题时,请务必指明这一点。

但无论如何,我可以对答案采取行动。

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

这就是文档(xmlFormat())中的所有内容,它应该是您的第一个停靠点,包含这样的问题。

推荐的解决方案

ColdFusion 10及以上

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

ColdFusion 9及以下

使用底层Java库,CF10的encodeFor~()函数就足够了。一切都在这里:OWASP Java !Encoder Project。我最近没有必要使用这个代码,所以没有一个例子,但这一切看起来都很直接。试一试,如果遇到麻烦:提出一个新问题:我会找一些时间仔细看看。

答案 2 :(得分:0)

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

我从以下链接下载了最新版本的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>