最近在处理一个业务遇到一个问题。

简单描述这个业务就是,在填写完一份表单后需要将表单数据转换成xml形式存储数据,使用的是http请求的方式,并加密传输。但是有一个过程是接收方接收俺传递过去的数据后没有解析机制导致无法获取body内的数据。

//发送请求
String body = HttpRequest.post(ApiUrl + "/api/send/message")
    .header("Content-Type", "application/json")
    .body(JSONUtil.toJsonStr(formData4XML))//formData4XML表单内容
    .execute().body();

​ 这里要声明一下,formData4XML这个变量正是本文要展开讲的Document所转变而来的,那我们就不得不谈到到Document对象要创建的问题上面来了。

​ DocumentBuilderFactory是用于创建解析器配置的工厂类,使用该工厂类创建一个实例之后创建一个DocumentBuilder类的实例(该实例可用于将XML文档解析为一个文档对象),通过该实例也就是下列代码中的db.newDocument()创建一个空的文档对象,表示一个xml文档。

public  Document getDocument() throws ParserConfigurationException {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = factory.newDocumentBuilder();
    Document document = db.newDocument();
    document.setXmlStandalone(true);
    return document;

​ 这个方法结束之后呢,用日志输出一下返回值会发现,ducument的值为**[#ducument:null]**。其实生成的 Document 对象的值形式为 [#document:null]

//假设编写一个方法来实现往Document内添加元素和节点
public Document createXMLstr(Document document, FormData data) {
    try {
        //生成消息节点
        Element node = document.createElement("node");
        //Utils.returnElement() 方法创建名为 "attr1" 和 "attr2" 的子元素节点,并将它们添加到 "node" 节点中。
        node.appendChild(Utils.returnElement(document, "attr1", data.getAttr1()));
        node.appendChild(Utils.returnElement(document, "attr2", data.getAttr2()));
        return document;
    }catch (Exception e) {
        e.printStackTrace();
        log.info("生成消息XML失败");

​ 在输出来的值当中,[#document] 表示该对象是一个 XML 文档对象(Document 对象),null 表示该对象没有指定名称。这种形式的字符串可以提供一些基本的信息来描述对象,但并不代表对象的具体内容。

​ 要访问和修改 Document 对象的内容,您需要使用 Document 接口提供的方法,如 getDocumentElement()createElement()appendChild() 等。通过这些方法,您可以创建或获取元素、属性以及其他节点,并对它们进行相应的操作。

​ 因此,虽然 Document 对象的值形式为 [#document:null],但实际上它包含了表示整个 XML 文档结构的节点树,可以使用适当的方法来访问和操作其中的内容。

​ 到时候生成的xml就是这种形式(当然不一定是我下面写的这种排版方式,而且encoding也不一定是utf-8)

<?xml version="1.0" encoding="UTF-8"?>
  <attr1>value1</attr1>
  <attr2>value2</attr2>
</node>

​ 所以调试的时候并不是说日志无法直接输出document就是错误的,因为Document没有提供直接将其内容以字符串形式输出的方法,所以,使用TransformFactory构造一个实例来创建数据转换器,把ducument封装成DOM的源作为Transformer对象的输入就可以了。使用以下方法,传入document对象,即可获取解析之后的结果了。

public String formatDocument(Document document) {
    try{
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(document);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        StreamResult result  = new StreamResult(outputStream);
        transformer.transform(source, result);
        return outputStream.toString();
    }catch (TransformerException e) {
        log.info("Error formatting Document: {}",e.getMessage());
        return null;

​ 解析出来之后的结果:

<?xml version="1.0" encoding="UTF-8"?><xx><xx> .. <> 
//具体流程可以参考以下
//1、获取表单数据
//2、创建document对象
//3、调用createXMLstr(document, data)并返回添加了消息节点的document
//4、接收后,转换成JSON格式写进去http请求的body当中

​ 对数据的加密有空再讲吧。

mybatis报错:Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: 报错filtering ..\main\resources\lib\\xx**.jar to \target\classes\lib\\**xx.jar failed with Malformed.. CSDN-Ada助手: Java 技能树或许可以帮到你:https://edu.csdn.net/skill/java?utm_source=AI_act_java 解决不了IDEA创建maven工程没有Spring.xml文件选项?或许问题在这。 EasyJax: CSDN-Ada助手: 恭喜您写了这么有价值的博客,分享了您在Hutool和POI读写excel中遇到的错误以及POM.xml依赖的相关经验。非常感谢您对技术社区的贡献。接下来,建议您可以继续分享您在其他方面的技术积累,让更多人受益。再次感谢您的分享。 CSDN 会根据你创作的前四篇博客的质量,给予优秀的博主博客红包奖励。请关注 https://bbs.csdn.net/forums/csdnnews?typeId=116148&utm_source=csdn_ai_ada_blog_reply4 看奖励名单。