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

使用d06a映射模型将Smooks生成的XML转换回EDIFACT方案咨询

问题根因分析

你出现报错的核心原因是读写配置用反了:UNEdifactReaderConfigurator/EDIReaderConfigurator 是用于读取EDIFACT格式输入的配置类,反向转换时输入的是XML数据,用EDI读取器去解析XML内容自然无法识别标签前缀,才会抛出控制段识别错误。

可行实现方案

Smooks 1.7.1搭配官方的EDIFACT映射包本身支持双向转换,无需修改原有映射模型,仅需要调整Smooks的读写配置逻辑即可,核心是改用UNEdifactWriterConfigurator配置EDIFACT输出规则。

正确实现代码

// 输入为之前生成的Smooks标准格式XML字符串
String xmlInput = result.getResult();
// 映射URN和EDIFACT转XML时使用的完全一致,不要用通配符*
UNEdifactWriterConfigurator writerConfig = new UNEdifactWriterConfigurator("urn:org.milyn.edi.unedifact:d06a-mapping:1.4");
// 字符集和原始EDIFACT输入编码保持一致
writerConfig.setCharacterEncoding("ISO-8859-2");

try (Smooks smooks = new Smooks()) {
    smooks.setWriterConfig(writerConfig);
    StringResult edifactResult = new StringResult();
    try (InputStream xmlIs = new ByteArrayInputStream(xmlInput.getBytes(Charset.forName("ISO-8859-2")))) {
        smooks.filterSource(new StreamSource(xmlIs), edifactResult);
    }
    // 输出还原后的EDIFACT内容
    System.out.println(edifactResult.getResult());
}

注意事项

  • 输入的XML必须是Smooks从EDIFACT转换生成的标准格式,不能随意修改节点结构、删除控制段(UNB/UNH/UNT/UNZ等)对应的XML节点,否则会序列化失败
  • 映射URN必须和EDIFACT转XML时使用的完全一致,不要使用通配符*,避免加载到不匹配的映射版本导致字段错位
  • 输入输出的字符集必须统一,和原始EDIFACT的编码保持一致,避免特殊字符乱码

内容的提问来源于stack exchange,提问作者Jedrula

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:27:04