2016-12-29 268 views
1

我目前正在映射Json和XSD。 在Json中,数组包含具有相同元素的多个项目。如何将Json数组转换为XSD

JSON数组是这样的:

"Item":[ 
    { 
     "ItemSequenceNo":0, 
     "AQuantity":{ 
     "code":"aaa", 
     "quantity":1 
     }, 
     "DQuantity":{ 
     "code":"ddd", 
     "quantity":4 
     }, 
     "Amount":{ 
     "currencyID":"USD", 
     "value":111 
     }, 

    }, 
    { 
     "ItemSequenceNo":1, 
     "AQuantity":{ 
     "code":"aaa", 
     "quantity":4 
     }, 
     "DQuantity":{ 
     "code":"ddd", 
     "quantity":9 
     }, 
     "Amount":{ 
     "currencyID":"USD", 
     "value":123 
     }, 
    } 
] 

我试图映射此JSON数组使用XSD:

<xs:element name="Item"> 
    <xs:complexType> 
     <xs:sequence minOccurs="1" maxOccurs="50"> 
      <xs:element ref="p:ItemSequenceNo" minOccurs="1" maxOccurs="1"/> 
      <xs:element ref="p:AQuantity" minOccurs="1" maxOccurs="1"/> 
      <xs:element ref="p:DQuantity" minOccurs="1" maxOccurs="1"/> 
      <xs:element ref="p:Amount" minOccurs="1" maxOccurs="1"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

其中裁判是这样的:

<xs:element name="ItemSequenceNo"> 
    <xs:simpleType> 
     <xs:restriction base="xs:integer"> 
      <xs:totalDigits value="5"/> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:element> 
<xs:element name="AQuantity"> 
    <xs:complexType> 
     <xs:simpleContent> 
      <xs:extension base="xs:integer"> 
       <xs:attribute name="code"> 
        <xs:simpleType> 
         <xs:restriction base="xs:string"> 
          <xs:minLength value="0"/> 
          <xs:maxLength value="3"/> 
         </xs:restriction> 
        </xs:simpleType> 
       </xs:attribute> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 
<xs:element name="DQuantity"> 
    <xs:complexType> 
     <xs:simpleContent> 
      <xs:extension base="xs:integer"> 
       <xs:attribute name="code"> 
        <xs:simpleType> 
         <xs:restriction base="xs:string"> 
          <xs:minLength value="0"/> 
          <xs:maxLength value="3"/> 
         </xs:restriction> 
        </xs:simpleType> 
       </xs:attribute> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 
<xs:element name="Amount"> 
    <xs:complexType> 
     <xs:simpleContent> 
      <xs:extension base="xs:integer"> 
       <xs:attribute name="CurrencyID"> 
        <xs:simpleType> 
         <xs:restriction base="xs:string"> 
          <xs:minLength value="0"/> 
          <xs:maxLength value="3"/> 
         </xs:restriction> 
        </xs:simpleType> 
       </xs:attribute> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 

事情是当我使用XSD映射Json数组时,数组项(元素)排序的输出XML如下所示:

<item> 
    <ItemSequenceNo >0</ItemSequenceNo> 
    <ItemSequenceNo >1</ItemSequenceNo> 
    <AQuantity code="aaa">1</AQuantity> 
    <AQuantity code="aaa">4</AQuantity> 
    <DQuantity code="ddd">4</DQuantity> 
    <DQuantity code="ddd">9</DQuantity> 
    <Amount CurrencyID="USD">111</Amount> 
    <Amount CurrencyID="USD">123</Amount> 
</item> 

,而我期待的结果是两个独立的模块:

<item> 
    <ItemSequenceNo >0</ItemSequenceNo> 
    <AQuantity code="aaa">1</AQuantity> 
    <DQuantity code="ddd">4</DQuantity> 
    <Amount CurrencyID="USD">111</Amount> 
</item> 

<item> 
    <ItemSequenceNo >1</ItemSequenceNo> 
    <AQuantity code="aaa">4</AQuantity> 
    <DQuantity code="ddd">9</DQuantity> 
    <Amount CurrencyID="USD">123</Amount> 
</item> 

有没有人对我怎么能得到这个任何想法?通过修改Json/XSD,还是有MapForce可以实现这个功能?

+0

谢谢大家。问题解决了。事实证明,在MapForce中,数组可以被识别并生成我想要的输出。 – BOSubuntu

回答

0

你已经解决了它,就像你在你的评论中说的那样,但是对于那些在这里遇到同样问题的人来说,寻找一个解决方案,在这里提供一个答案会很好。

这可能有点违反直觉,即在MapForce中,您不会将JSON输入中的项目数组的线条绘制到XML输出中的项目节点。如果你这样做,你会得到BOSubuntu描述的统一输出。而是从数组包含的对象中绘制线条(请参阅下图,红色的线条)。这会给出所需的输出。

JSON-Mapping to XML in Altova MapForce