EDI 必须至少是段 [UNS] 的 1 个实例

EDI Must be a minimum of 1 instances of segment [UNS]

我是 EDI 新手。我刚刚使用 smooks api 将 ORDERS edi 文件转换为 XML。一些 ORDER 示例文件在以下示例中运行良好。但是当我 运行 以下 edi 文件时出现以下异常。我坚持这个。这是我的示例和 EDI 数据

package example;

import org.json.JSONObject;
import org.json.XML;
import org.milyn.Smooks;
import org.milyn.SmooksException;
import org.milyn.io.StreamUtils;
import org.milyn.smooks.edi.unedifact.UNEdifactReaderConfigurator;
import org.xml.sax.SAXException;

import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.StringWriter;

public class Main {
 public static int PRETTY_PRINT_INDENT_FACTOR = 4;
protected static String runSmooksTransform() throws IOException, SAXException, SmooksException {
    Smooks smooks = new Smooks();
    smooks.setReaderConfig(new UNEdifactReaderConfigurator("urn:org.milyn.edi.unedifact:d93a-mapping:*"));
    try {
        StringWriter writer = new StringWriter();

        smooks.filterSource(new StreamSource(new FileInputStream("EDI.edi")), new StreamResult(writer));

        return writer.toString();
    } finally {
        smooks.close();
    }
}

public static void main(String[] args) throws IOException, SAXException, SmooksException {

    System.out.println("\n\n==============Message In==============");
    System.out.println(readInputMessage());
    System.out.println("======================================\n");

    String messageOut = Main.runSmooksTransform();

    System.out.println("==============Message Out=============");
    System.out.println(messageOut);
    System.out.println("======================================\n\n");

    JSONObject xmlJSONObj = XML.toJSONObject(messageOut);
    String jsonPrettyPrintString = xmlJSONObj.toString(PRETTY_PRINT_INDENT_FACTOR);
    System.out.println(jsonPrettyPrintString);
}

private static String readInputMessage() throws IOException {
    return StreamUtils.readStreamAsString(new FileInputStream("EDI.edi"));
}
}

以及示例 EDI 数据的例外情况

Exception in thread "main" org.milyn.SmooksException: Failed to filter source.
at org.milyn.delivery.sax.SmooksSAXFilter.doFilter(SmooksSAXFilter.java:97)
at org.milyn.delivery.sax.SmooksSAXFilter.doFilter(SmooksSAXFilter.java:64)
at org.milyn.Smooks._filter(Smooks.java:526)
at org.milyn.Smooks.filterSource(Smooks.java:482)
at org.milyn.Smooks.filterSource(Smooks.java:456)
at example.Main.runSmooksTransform(Main.java:49)
at example.Main.main(Main.java:63)
Caused by: org.milyn.edisax.EDIParseException: EDI message processing failed [ORDERS][D:93A:UN].  Must be a minimum of 1 instances of segment [UNS].  Currently at segment number 9.
at org.milyn.edisax.EDIParser.mapSegments(EDIParser.java:499)
at org.milyn.edisax.EDIParser.mapSegments(EDIParser.java:450)
at org.milyn.edisax.EDIParser.parse(EDIParser.java:426)
at org.milyn.edisax.EDIParser.parse(EDIParser.java:410)
at org.milyn.edisax.unedifact.handlers.UNHHandler.process(UNHHandler.java:97)
at org.milyn.edisax.unedifact.handlers.UNBHandler.process(UNBHandler.java:75)
at org.milyn.edisax.unedifact.UNEdifactInterchangeParser.parse(UNEdifactInterchangeParser.java:113)
at org.milyn.smooks.edi.unedifact.UNEdifactReader.parse(UNEdifactReader.java:75)
at org.milyn.delivery.sax.SAXParser.parse(SAXParser.java:76)
at org.milyn.delivery.sax.SmooksSAXFilter.doFilter(SmooksSAXFilter.java:86)
... 6 more

错误的源数据会导致这种情况。

看起来 smooks 正在寻找一个不在您的数据中的 UNS 段。根据 D.93A 标准,部分控制是强制性的。