【问题标题】:A decimal representation must immediately follow the "&#" in a character reference十进制表示必须紧跟字符引用中的“&#”
【发布时间】:2016-03-04 11:20:28
【问题描述】:

我正在通过 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>

现在我面临以下错误:

十进制表示必须紧跟在“”之后 字符参考。

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

谁能帮我解决这个问题。

【问题讨论】:

  • 您是否验证了您从 tika 获得的数据实际上是有效的 PDF?您如何序列化 PDF 二进制文件以插入 XML?基本上:向我们展示一些代码。 sscce.org
  • #Adam,我刚刚用代码更新了我的问题。

标签: xml unicode solr coldfusion coldfusion-9


【解决方案1】:

我正在按照亚当的建议更新我的答案。现在我已经使用 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>

【讨论】:

  • 问题在于,您实际上是在无缘无故地更改数据中的值。如果您只是正确地对数据进行编码,您将不会遇到您试图在此处手动“修复”的问题。
  • @Adam,是的,你是对的。我试图对其进行编码,但面临错误。可能是我无法正确地做到这一点。我使用了来自 link 的 encodeforxml。并面临这个错误:“字符引用“”是无效的 XML 字符”..这就是我使用这些函数的原因。感谢您的帮助。
  • 再一次,如果您遇到问题... 问一个问题(但要正确地提出问题,使用重现案例等),不要只是编写糟糕的代码墙纸的情况。
  • 感谢@adam。我会记住你的建议。现在,我想在 SOLR 中测试一些东西。之后我会尝试 encodeforxml 函数并提出问题,如果我会遇到问题。
【解决方案2】:

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

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

但无论如何,我可以在答案上赌一把。

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

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

推荐的解决方案

ColdFusion 10 及更高版本

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

ColdFusion 9 及以下

使用 CF10 的 encodeFor~() 函数的底层 Java 库就足够简单了。都在这里:OWASP Java !Encoder Project。我最近不必使用此代码,因此没有示例,但这一切似乎都相当简单。试一试,如果遇到麻烦:提出一个新问题:我会找时间仔细研究一下。

【讨论】:

  • 感谢您的反馈,我正在使用 Coldfusion 9。我也更新了我的问题。
  • 谢谢亚当,我已经尝试过了,但无法通过这个解决它。但这确实帮助我解决了这个问题。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多