You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 06:05:30