Document生成xml文件以及输出[#document:null]问题
最近在处理一个业务遇到一个问题。
简单描述这个业务就是,在填写完一份表单后需要将表单数据转换成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"?>
<node>
<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当中
对数据的加密有空再讲吧。