最近在处理一个业务遇到一个问题。
简单描述这个业务就是,在填写完一份表单后需要将表单数据转换成xml形式存储数据,使用的是http请求的方式,并加密传输。但是有一个过程是接收方接收俺传递过去的数据后没有解析机制导致无法获取body内的数据。
String body = HttpRequest.post(ApiUrl + "/api/send/message")
.header("Content-Type", "application/json")
.body(JSONUtil.toJsonStr(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]
。
public Document createXMLstr(Document document, FormData data) {
try {
Element node = document.createElement("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> .. <>
对数据的加密有空再讲吧。
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助手:
解决不了IDEA创建maven工程没有Spring.xml文件选项?或许问题在这。
EasyJax:
CSDN-Ada助手: