SAXParseException/SAXParseException/XRRuntimeException报错解决


报错信息:

org.xhtmlrenderer.util.XRRuntimeException: Can't load the XML resource (using TrAX transformer). org.xml.sax.SAXParseException; lineNumber: 343; columnNumber: 50; The content of elements must consist of well-formed character data or markup.
	at org.xhtmlrenderer.resource.XMLResource$XMLResourceBuilder.transform(XMLResource.java:222)
	at org.xhtmlrenderer.resource.XMLResource$XMLResourceBuilder.createXMLResource(XMLResource.java:181)
	at org.xhtmlrenderer.resource.XMLResource.load(XMLResource.java:84)
	at org.xhtmlrenderer.pdf.ITextRenderer.setDocumentFromString(ITextRenderer.java:168)
	at org.xhtmlrenderer.pdf.ITextRenderer.setDocumentFromString(ITextRenderer.java:163)
	at com.service.common.util.FileUtil.strToPdfFile(FileUtil.java:62)
	at com.service.signContract.MerchantPayContractService.signContract(MerchantPayContractService.java:110)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
Caused by: javax.xml.transform.TransformerException: org.xml.sax.SAXParseException; lineNumber: 343; columnNumber: 50; The content of elements must consist of well-formed character data or markup.
	at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:755)
	at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:357)
	at org.xhtmlrenderer.resource.XMLResource$XMLResourceBuilder.transform(XMLResource.java:220)
	... 13 more
Caused by: org.xml.sax.SAXParseException; lineNumber: 343; columnNumber: 50; The content of elements must consist of well-formed character data or markup.
	at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
	at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:674)
	at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:743)
	... 15 more

原因是因为XML字符串内容“...高新区江南路XX号<14-27>”里面包含了额外的“<“、”>”号,需要转义

类似报错

org.xhtmlrenderer.util.XRRuntimeException: Can't load the XML resource (using TrAX transformer). org.xml.sax.SAXParseException; lineNumber: 337; columnNumber: 47; The reference to entity "bar" must end with the ';' delimiter.
    at org.xhtmlrenderer.resource.XMLResource$XMLResourceBuilder.transform(XMLResource.java:222)
    at org.xhtmlrenderer.resource.XMLResource$XMLResourceBuilder.createXMLResource(XMLResource.java:181)
    at org.xhtmlrenderer.resource.XMLResource.load(XMLResource.java:84)
    at org.xhtmlrenderer.pdf.ITextRenderer.setDocumentFromString(ITextRenderer.java:168)
    at org.xhtmlrenderer.pdf.ITextRenderer.setDocumentFromString(ITextRenderer.java:163)
    at com.common.util.FileUtil.strToPdfFile(FileUtil.java:62)
    at com.service.signContract.MerchantPayContractService.signContract(MerchantPayContractService.java:110)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: javax.xml.transform.TransformerException: org.xml.sax.SAXParseException; lineNumber: 337; columnNumber: 47; The reference to entity "bar" must end with the ';' delimiter.
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:755)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:357)
    at org.xhtmlrenderer.resource.XMLResource$XMLResourceBuilder.transform(XMLResource.java:220)
    ... 13 more
Caused by: org.xml.sax.SAXParseException; lineNumber: 337; columnNumber: 47; The reference to entity "bar" must end with the ';' delimiter.
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:674)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:743)
    ... 15 more


原因是因为XML字符串内容"....店名 三十cafe&bar"里面包含了额外的“&”号,也需要转义

转义对照表:
https://bbs.huaweicloud.com/blogs/312362

编码实现:
 

 /**
     * 将字符串中的XML特殊字符转义
     * & -> &amp;
     * < -> &lt;
     * > -> &gt;
     * " -> &quot;
     * ' -> &apos;
     * **/
    public static String covertXML(String content) {
        char[] originContentChars = content.toCharArray();
        int finalContentCharLength = 0;//转义后字符串长度
        for (char contentChar : originContentChars) {
            switch (contentChar) {
                case '&':
                    finalContentCharLength = finalContentCharLength + 5;
                    continue;
                case '"':
                case '\'':
                    finalContentCharLength = finalContentCharLength + 6;
                    continue;
                case '<':
                case '>':
                    finalContentCharLength = finalContentCharLength + 4;
                    continue;
                default:
                    finalContentCharLength = finalContentCharLength + 1;
            }

        }
        char[] newContentChars = new char[finalContentCharLength];
        int newContentCharsPos = 0;
        for (char originContentChar : originContentChars) {
            switch (originContentChar) {
                case '&':
                //& -> &amp;
                    newContentChars[newContentCharsPos] = '&';
                    newContentChars[newContentCharsPos + 1] = 'a';
                    newContentChars[newContentCharsPos + 2] = 'm';
                    newContentChars[newContentCharsPos + 3] = 'p';
                    newContentChars[newContentCharsPos + 4] = ';';
                    newContentCharsPos += 5;
                    continue;
                case '"':
                //" -> &quot;
                    newContentChars[newContentCharsPos] = '&';
                    newContentChars[newContentCharsPos + 1] = 'q';
                    newContentChars[newContentCharsPos + 2] = 'u';
                    newContentChars[newContentCharsPos + 3] = 'o';
                    newContentChars[newContentCharsPos + 4] = 't';
                    newContentChars[newContentCharsPos + 5] = ';';
                    newContentCharsPos += 6;
                    continue;
                case '\'':
                //' -> &apos;
                    newContentChars[newContentCharsPos] = '&';
                    newContentChars[newContentCharsPos + 1] = 'a';
                    newContentChars[newContentCharsPos + 2] = 'p';
                    newContentChars[newContentCharsPos + 3] = 'o';
                    newContentChars[newContentCharsPos + 4] = 's';
                    newContentChars[newContentCharsPos + 5] = ';';
                    newContentCharsPos += 6;
                    continue;
                case '<':
                //< -> &lt;
                    newContentChars[newContentCharsPos] = '&';
                    newContentChars[newContentCharsPos + 1] = 'l';
                    newContentChars[newContentCharsPos + 2] = 't';
                    newContentChars[newContentCharsPos + 3] = ';';
                    newContentCharsPos += 4;
                    continue;
                case '>':
                //> -> &gt;
                    newContentChars[newContentCharsPos] = '&';
                    newContentChars[newContentCharsPos + 1] = 'g';
                    newContentChars[newContentCharsPos + 2] = 't';
                    newContentChars[newContentCharsPos + 3] = ';';
                    newContentCharsPos += 4;
                    continue;
                default:
                    newContentChars[newContentCharsPos] = originContentChar;
                    newContentCharsPos++;
            }
        }
        return new String(newContentChars);
    }

### 解决 Oracle 中遇到的 SAXParseException 错误 当处理 XML 文件并将其解析到数据库中时,`SAXParseException` 常见于不正确的 XML 结构或 DTD 定义。对于 Oracle 数据库中的此类错误,通常涉及的是通过 Java 应用程序或其他工具向数据库发送带有 XML 内容的操作。 #### 1. 检查 XML 文档结构 确保 XML 文档遵循正确的语法和语义规则。任何不符合标准的地方都可能导致 `SAXParseException` 报错。例如,在 MyBatis 映射文件中,如果头部声明有误,则会引发异常[^4]: ```xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.mapper.YourMapper"> <!-- 此处应放置具体的 SQL 语句 --> </mapper> ``` #### 2. 验证 DOCTYPE 和命名空间定义 确认文档根元素及其对应的 DTD 或者 XSD 是否匹配预期的要求。比如,Spring 的配置文件应该以 `<beans>` 开始而不是其他标签[^2]: ```xml <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- Bean definitions go here --> </beans> ``` #### 3. 处理特殊字符编码问题 有时由于字符集设置不当也会引起类似的异常。确保所有参与的数据源(如文件、网络传输等)均采用统一且兼容的字符编码格式,通常是 UTF-8 编码。 #### 4. 调试与日志记录 启用详细的调试模式来捕获更多关于失败的信息。这有助于定位具体哪一部分的内容引起了异常。可以查看堆栈跟踪信息找到确切的位置,并据此调整输入数据。 #### 5. 使用验证工具 利用专业的 XML 验证器提前检测潜在的问题。这些工具有助于发现那些可能被忽视的小细节,从而减少部署后的麻烦。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值