1、返回数据中的字段可能包含“&”,解析中会报错“对实体 "mime_types" 的引用必须以 ';' 分隔符结尾”,如下图

 报错出现的原因:在xml文件中,某些特殊的字符代表特殊的含义,会干扰解析,如以下字段:

1、< 和 >用于定义标签。解析器将 <tag> 视为一个标签,而不是普通文本。如果直接使用 < 或 >,解析器可能会误以为是标签的开始或结束,从而导致解析错误。

2、&表示实体引用的开始(如 &amp; 或 &#x27; 等)。如果直接使用 &,解析器会认为它引入了一个实体,因此无法区分是否为普通字符。

3、' 和 "在XML属性中作为引号,解析器需要使用它们来区分属性的值。如果属性值中包含未转义的引号,解析器会无法正确识别属性的范围,导致错误解析。

 如果想当做正常的字符使用,需要将其转义处理,可以分别做如下转义

<用 &lt; 代替
>用 &gt; 代替
&用 &amp; 代替
'用 &apos; 代替
"用 &quot; 代替

 代码中将字符串replace

String newUrl=url.replaceAll("&", "&amp;");
2、获取到的xml数据如何快速解析并存储

    获取到的xml数据一般以字符串的形式进行解析,但怎样解析并存储为方便处理的数据结构以进行下一步逻辑运算呢,本文决定建立实体对应关系,丢弃冗余的switch对应的方法,假设获取到的xml数据结构如下:

<data>
  <return>
    <attachmentFormList>
       <fileName>测试</fileName>
       <id>1212</id>
    </attachmentFormList>
    <contactNumber>测试数据</contactNumber>
    <message>测试备注</message>
    <id>2323</id>
  </return>
  <return>
    <attachmentFormList>
       <fileName>测试</fileName>
       <id>1212</id>
    </attachmentFormList>
    <contactNumber>测试数据</contactNumber>
    <message>测试备注</message>
    <id>4545</id>
  </return>
</data>

   由于其中的file需要做特殊处理,且file有同级对应的相同的字段,决定同时设置file实体类,且return包裹的数据可能有多条,采用list实体类对其进行统一管理。关系由图所示:

建立表的实体为:

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;

@XmlRootElement(name = "data")
public class returnList {
    private List<OaDocument> returnList;
    private String code;


    public returnList() {
    }

    public List<OaDocument> getReturnList() {
        return returnList;
    }

    @XmlElement(name = "return")
    public void setReturnList(List<OaDocument> returnList) {
        this.returnList = returnList;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }
}

其中的注解为JAXB提供的xml数据绑定框架,将xml数据映射到java对象中,@XmlRootElement设置xml的总体根节点,@XmlElement设置根节点下的节点,与实体关系中的字段一一对应。

其余两个实体分别定义为OaDocument及attachmentFormList。

         解析xml并映射到returnlist的代码为:

JAXBContext jaxbContext = JAXBContext.newInstance(returnList.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
returnList returns = (returnList) unmarshaller.unmarshal(new StringReader(xmlData));
   for(OaDocument doc:returns.getReturnList()){ }
              
     

  分别拿到对应的实体后,可以进行下一步的逻辑操作或者存入数据库。

3、远程下载链接中包含中文字段,导致后台访问报错400

  后端需要访问远程下载链接并将文件存储到本地,但是直接访问链接会报错400,这时候需要将中文字符进行转换,以下为转换的代码,另外,由于转换后会同时将连接中的?、=、&分别转换为%3F、%3D、%26,访问依旧会报错,于是将其分别替代。

  public static String parseToBrowserCompatibleURL(String rawUrl) throws Exception {
        int fileIndex = rawUrl.lastIndexOf("/"); // 找到文件名位置
        String baseUrl = rawUrl.substring(0, fileIndex + 1); // 基础部分
        String fileName = rawUrl.substring(fileIndex + 1); // 文件名部分

        // 对文件名部分进行 URL 编码(UTF-8 是最常用的浏览器编码方式)
        String encodedFileName = URLEncoder.encode(fileName, "UTF-8")
                .replaceAll("%3D", "=").replaceAll("%26", "&").replaceAll("%3F", "?");
        return baseUrl + encodedFileName; // 拼接成完整 URL
    }

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐