我在smooks的帮助下在java程序中创建ANSI.X12消息。我正在使用xml文件(使用http://www.milyn.org/schema/edi-message-mapping-1.2.xsd
)自己定义X12消息。其中大部分都运行良好,但我确实遇到了ISA段的问题。我把它定义为:
<?xml version="1.0" encoding="UTF-8"?>
<medi:edimap xmlns:medi="http://www.milyn.org/schema/edi-message-mapping-1.2.xsd">
<medi:description name="Some X12 Message Definition" version="1.0" />
<medi:delimiters segment=" " field="*"
component="^" sub-component="~" escape="?" />
<medi:segments xmltag="Segments">
<medi:segment segcode="ISA" xmltag="InterchangeControlHeader">
<medi:field xmltag="AuthorizationInformationQualifier" />
<medi:field xmltag="AuthorizationInformation"/>
<medi:field xmltag="SecurityInformationQualifier"/>
<medi:field xmltag="SecurityInformation"/>
<medi:field xmltag="InterchangeSenderQualifier"/>
<medi:field xmltag="InterchangeSenderID"/>
<medi:field xmltag="InterchangeReceiverQualifier"/>
<medi:field xmltag="InterchangeReceiverID"/>
<medi:field xmltag="InterchangeDate" type="Date" typeParameters="format=yyMMdd"/>
<medi:field xmltag="InterchangeTime" type="Date" typeParameters="format=HHmm"/>
<medi:field xmltag="InterchangeControlStandardsIdentifier"/>
<medi:field xmltag="InterchangeControlVersionNumber"/>
<medi:field xmltag="InterchangeControlNumber"/>
<medi:field xmltag="AcknowledgmentRequested"/>
<medi:field xmltag="UsageIndicator"/>
<medi:field xmltag="ComponentElementSeparator"/>
</medi:segment>
[...]
只要我插入正确长度的字符串,这主要是可用的。问题在于组件分隔符(在这种情况下为^
)。 ISA段定义哪些字符是用于分隔段,元素等的特殊字符。当我将"^"
作为值放入ComponentElementSeparator
时,它会被转义(当然),因为它是一个特殊的字符,并且smooks不知道我的ISA段是特殊的ISA段。
我得到了
ISA*00* *00* *01*000000987654321*01*000000123456789*141031*1656*U*00401*000002388*0*T*?^
应该在哪里
ISA*00* *00* *01*000000987654321*01*000000123456789*141031*1656*U*00401*000002388*0*T*^
(请注意?
之前的^
}。
到目前为止我唯一的解决方法是将一些不同的char添加到medi:delimiters
<medi:delimiters segment=" " field="*" component="<" sub-component="~" escape="?" />
中,但是只要该char出现在某个地方的数据中,就会产生问题。这特别令人沮丧,因为消息甚至不使用任何必须分离的组件。
我在smooks的文档中找不到任何关于它的信息,但必须以某种方式来做到这一点。毕竟,X12是我所知道的两个原因之一,任何人都会首先使用smooks(另一个是EDIFACT)。
任何人都知道在我的smooks消息描述中插入ISA的正确方法吗?
答案 0 :(得分:0)
这可能会迟到,但我遇到了这个问题。我已经确定了问题(如果你使用EJC生成)是在每个段输出步骤结束时添加以下内容:
writer.write(EDIUtils.concatAndTruncate(nodeTokens, DelimiterType.FIELD, delimiters));
如果分隔符是最后一个(ISA.ComponentElementSeparator是),它将被截断,除非它是使用转义定义的,这不是此特定方案所需的行为。还没有答案,但想提出问题的根源。
在此处添加了问题定义和可能的方向:https://github.com/smooks/smooks/issues/114
更新:如果使用EJC,请设置以下内容:
<medi:import truncatableSegments="false" ....