1

我目前正在映射 Json 和 XSD。在 Json 中有一个数组包含多个具有相同元素的项目。

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
      },
   }
]

我试图用 XSD 映射这个 Json 数组:

<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>

ref 是这样的:

<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可以实现这一点?

4

1 回答 1

0

正如您在评论中所说,您已经解决了它,但是对于遇到同样问题的人来说,寻找解决方案,在这里提供答案会很好。

这可能有点违反直觉,在 MapForce 中,您不会从 JSON 输入中的 Item-Array 到 XML 输出中的 Item 节点画线。如果这样做,您将获得 BOSubuntu 描述的统一输出。相反,您从数组包含的对象中画线(见下图,用红色标记的线)。这将提供所需的输出。

在 Altova MapForce 中 JSON 映射到 XML

于 2017-05-24T14:22:01.093 回答