修改XSD适配SAP Idoc WMTORD结构的技术咨询
正确定义SAP IDoc E1LTORH结构的XSD方案
首先,你遇到的核心问题是XSD不允许在同一个complexType中直接混合使用<xsd:all>和<xsd:sequence>,而且<xsd:all>的maxOccurs属性只能是0或1(默认就是1,不需要显式设置)。针对SAP IDoc WMTORD里的E1LTORH结构——包含一批仅出现一次的子元素,以及可重复出现的E1LTORI子标签,我们可以通过嵌套结构来实现正确的定义:
核心思路
把E1LTORH的内容分成两部分处理:
- 所有仅出现一次的子元素:用
<xsd:all>定义(因为SAP IDoc的segment子元素通常不要求固定顺序),如果确定元素顺序固定,也可以用<xsd:sequence>替代。 - 可重复的E1LTORI子标签:单独放在一个
<xsd:element>里,设置maxOccurs="unbounded",并嵌套在<xsd:sequence>中(用来包裹单次元素组和重复元素,保证结构层次合法)。
修正后的完整XSD代码
<xsd:element name="E1LTORH" type="E1LTORHType" minOccurs="0"/> <xsd:complexType name="E1LTORHType"> <!-- 用sequence包裹单次元素组和重复元素,解决all与重复元素的兼容问题 --> <xsd:sequence> <!-- 所有单次出现的子元素,用all定义支持任意顺序 --> <xsd:all> <xsd:element name="LGNUM" type="xsd:string" minOccurs="0"/> <xsd:element name="TANUM" type="xsd:string" minOccurs="0"/> <xsd:element name="BWLVS" type="xsd:string" minOccurs="0"/> <xsd:element name="TRART" type="xsd:string" minOccurs="0"/> <xsd:element name="BNAME" type="xsd:string" minOccurs="0"/> <xsd:element name="PERNR" type="xsd:string" minOccurs="0"/> <xsd:element name="SOLWM" type="xsd:string" minOccurs="0"/> <xsd:element name="SOLEX" type="xsd:string" minOccurs="0"/> <xsd:element name="ISTWM" type="xsd:string" minOccurs="0"/> <xsd:element name="STDAT" type="xsd:string" minOccurs="0"/> <xsd:element name="ENDAT" type="xsd:string" minOccurs="0"/> <xsd:element name="STUZT" type="xsd:string" minOccurs="0"/> <xsd:element name="ENUZT" type="xsd:string" minOccurs="0"/> <xsd:element name="SWABW" type="xsd:string" minOccurs="0"/> <xsd:element name="TAPRI" type="xsd:string" minOccurs="0"/> </xsd:all> <!-- 可重复的E1LTORI标签,设置maxOccurs="unbounded"支持多次出现 --> <xsd:element name="E1LTORI" type="E1LTORIType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> <!-- 添加E1LTORH的SEGMENT属性,示例中为必填项 --> <xsd:attribute name="SEGMENT" type="xsd:string" use="required"/> </xsd:complexType> <xsd:complexType name="E1LTORIType"> <!-- E1LTORI的子元素用all定义,支持任意顺序 --> <xsd:all> <xsd:element name="TAPOS" type="xsd:integer" minOccurs="0"/> <xsd:element name="MATNR" type="xsd:string" minOccurs="0"/> <xsd:element name="WERKS" type="xsd:string" minOccurs="0"/> <xsd:element name="CHARG" type="xsd:string" minOccurs="0"/> <xsd:element name="MEINS" type="xsd:string" minOccurs="0"/> <xsd:element name="LETYP" type="xsd:string" minOccurs="0"/> <xsd:element name="KZQUI" type="xsd:string" minOccurs="0"/> <xsd:element name="WDATU" type="xsd:string" minOccurs="0"/> <xsd:element name="WENUM" type="xsd:string" minOccurs="0"/> <xsd:element name="WEPOS" type="xsd:integer" minOccurs="0"/> <xsd:element name="VLTYP" type="xsd:string" minOccurs="0"/> <xsd:element name="VLBER" type="xsd:string" minOccurs="0"/> <xsd:element name="VLPLA" type="xsd:string" minOccurs="0"/> <xsd:element name="VSOLM" type="xsd:string" minOccurs="0"/> <xsd:element name="NLTYP" type="xsd:string" minOccurs="0"/> <xsd:element name="NLBER" type="xsd:string" minOccurs="0"/> <xsd:element name="NLPLA" type="xsd:string" minOccurs="0"/> <xsd:element name="NSOLM" type="xsd:string" minOccurs="0"/> <xsd:element name="MAKTX" type="xsd:string" minOccurs="0"/> <xsd:element name="NLENR" type="xsd:string" minOccurs="0"/> <xsd:element name="QPLOS" type="xsd:string" minOccurs="0"/> <xsd:element name="QPLOA" type="xsd:string" minOccurs="0"/> <xsd:element name="LGORT" type="xsd:string" minOccurs="0"/> <xsd:element name="SOLPO" type="xsd:string" minOccurs="0"/> <xsd:element name="VOLUM" type="xsd:string" minOccurs="0"/> <xsd:element name="NPLEI" type="xsd:integer" minOccurs="0"/> <xsd:element name="NWIRM" type="xsd:string" minOccurs="0"/> <!-- 保留你原有的Operation元素,若未定义OperationType需补充 --> <xsd:element name="Operation" type="OperationType" minOccurs="0"/> </xsd:all> <xsd:attribute name="SEGMENT" type="xsd:string" use="required"/> </xsd:complexType> <!-- 若未定义OperationType,补充示例结构(按需调整) --> <xsd:complexType name="OperationType"> <xsd:sequence> <xsd:element name="OperationField" type="xsd:string" minOccurs="0"/> </xsd:sequence> </xsd:complexType>
关键说明
- 解决结构冲突:通过在
E1LTORHType里用<xsd:sequence>包裹<xsd:all>(单次元素组)和重复的E1LTORI元素,既满足了单次元素的无序性,又实现了重复元素的多次出现,避开了XSD的语法限制。 - 补充遗漏元素:你的示例XML里包含很多原XSD未定义的元素(比如
BWLVS、TRART、KZQUI等),必须将这些元素添加到XSD中,否则XML验证会失败。 - 属性处理:给E1LTORH和E1LTORI都添加了
SEGMENT属性,并设置use="required"(如果允许该属性可选,可改为use="optional"或直接移除use属性)。 - all vs sequence选择:如果SAP IDoc的segment子元素是固定顺序的,可将
<xsd:all>替换为<xsd:sequence>,强制元素顺序与XSD定义一致;若顺序不固定,用<xsd:all>更灵活。
内容的提问来源于stack exchange,提问作者mohamed amine
相关产品推荐
相关产品推荐

