Java中JSON转XML遇根节点问题,报解析异常
问题原因与解决方案
错误根源
你遇到的Unexpected character encountered while parsing value: #错误,核心原因是存入Cosmos的内容不符合绑定预期的格式:
- Java中
org.w3c.dom.Document的默认toString()方法返回的不是XML文本,而是类似[#document: null]的对象标识字符串,开头的#字符触发了JSON解析错误(Cosmos DB Output绑定默认会尝试将字符串按JSON处理)。 - 你试图直接存储XML,但Cosmos的
OutputBinding<String>默认期望JSON格式内容,直接传入XML字符串会触发解析异常。
修复步骤
1. 正确将DOM Document转为XML字符串
替换原代码中document.toString()的逻辑,用Transformer将DOM对象转换成标准XML文本:
// 替换原document.toString()相关代码 TransformerFactory tf = TransformerFactory.newInstance(); Transformer transformer = tf.newTransformer(); transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); transformer.setOutputProperty(OutputKeys.METHOD, "xml"); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); StringWriter writer = new StringWriter(); transformer.transform(new DOMSource(document), new StreamResult(writer)); String xmlString = writer.getBuffer().toString();
2. 调整Cosmos存储方式(推荐)
将XML字符串包装为JSON对象的字段存入Cosmos,避免绑定的JSON解析逻辑报错:
// 包装XML为JSON文档 JSONObject cosmosDoc = new JSONObject(); cosmosDoc.put("id", context.getInvocationId().toString()); cosmosDoc.put("xmlContent", xmlString); outputItem.setValue(cosmosDoc.toString());
3. 验证JSON转XML结果(可选)
在JsonToXml方法中添加日志,确认转换后的XML格式合法:
public String JsonToXml(String payload) { JSONObject myPayload = new JSONObject(payload); JSONObject root = new JSONObject(); root.put("payload", myPayload); String xml = XML.toString(root); // 打印日志确认XML内容 System.out.println("Generated XML: " + xml); return xml; }
修复后核心代码片段
// 替换原代码中从Document创建到outputItem.setValue的全部逻辑 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(new InputSource(new StringReader(payload))); document.normalize(); // DOM转XML字符串 TransformerFactory tf = TransformerFactory.newInstance(); Transformer transformer = tf.newTransformer(); transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); transformer.setOutputProperty(OutputKeys.METHOD, "xml"); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); StringWriter writer = new StringWriter(); transformer.transform(new DOMSource(document), new StreamResult(writer)); String xmlString = writer.getBuffer().toString(); // 包装为JSON存入Cosmos JSONObject cosmosDoc = new JSONObject(); cosmosDoc.put("id", context.getInvocationId().toString()); cosmosDoc.put("xmlData", xmlString); outputItem.setValue(cosmosDoc.toString());
内容的提问来源于stack exchange,提问作者ScottG
相关产品推荐
相关产品推荐

