使用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
相关产品推荐
相关产品推荐

