面对使用Altova MapForce从平面文件格式映射XML的困难

时间:2018-03-16 10:20:58

标签: xml xsd altova map-force

我已设法通过水平分割来映射每一行。 当(Q1, Q2)和(Q3,Q4)没有在各自的封闭标签下聚集时出现问题。此外,我们需要处理一组重复的行。就像下面的例子中一样,我再次重复了两行。

Q12222222222
Q21111111111
Q13333333333
Q24444444444
Q35555555555
Q46666666666

目标XSD 文件如下:

<xs:schema>
    <xs:element name="Statement">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="StatementDetails" type="StatementDetailsT" maxOccurs="unbounded"/>
                <xs:element name="FinalStatement" type="FinalStatementT" minOccurs="0" maxOccurs="1"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="StatementDetailsT">
        <xs:sequence>
            <xs:element name="Q1" type="Q1_T" maxOccurs="1"/>
            <xs:element name="Q2" type="Q2_T" maxOccurs="1"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="FinalStatementT">
        <xs:sequence>
            <xs:element name="Q3" type="Q3_T" maxOccurs="1"/>
            <xs:element name="Q4" type="Q4_T" maxOccurs="1"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="Q1_T">
        <xs:sequence>
            <xs:element type="st:string2" name="cIdentifier" fixed="Q1" />
            <xs:element type="st:string10" name="sNumber" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="Q2_T">
        <xs:sequence>
            <xs:element type="st:string2" name="cIdentifier" fixed="Q2" />
            <xs:element type="st:string11" name="antiDumpingDuty" minOccurs="0" maxOccurs="1"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="Q3_T">
        <xs:sequence>
            <xs:element type="st:string2" name="cIdentifier" fixed="Q3" />
            <xs:element type="st:string10" name="sNumber" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="Q4_T">
        <xs:sequence>
            <xs:element type="st:string2" name="cIdentifier" fixed="Q4" />
            <xs:element type="st:string11" name="antiDumpingDuty" minOccurs="0" maxOccurs="1"/>
        </xs:sequence>
    </xs:complexType>

</xs:schema>

预期的XML 应如下所示:

    <Statement>
        <StatementDetails>
            <Q1>
                <cIdentifier>Q1</cIdentifier>
                <sNumber>2222222222</sNumber>
            </Q1>
            <Q2>
                <cIdentifier>Q2</cIdentifier>
                <antiDumpingDuty>1111111111</antiDumpingDuty>
            </Q2>
        </StatementDetails>
        <StatementDetails>
            <Q1>
                <cIdentifier>Q1</cIdentifier>
                <sNumber>3333333333</sNumber>
            </Q1>
            <Q2>
                <cIdentifier>Q2</cIdentifier>
                <antiDumpingDuty>4444444444</antiDumpingDuty>
            </Q2>
        </StatementDetails>
        <FinalStatement>
            <Q3>
                <cIdentifier>Q3</cIdentifier>
                <sNumber>5555555555</sNumber>               
            </Q3>
            <Q4>
                <cIdentifier>Q4</cIdentifier>
                <antiDumpingDuty>6666666666</antiDumpingDuty>
            </Q4>
        </FinalStatement>
    </Statement>

我已按以下顺序应用拆分:

  1. 使用模式重复拆分:分隔(行以)开头, Reg-ex:是的,模式:^Q[13] 这将数据划分为3个段,每段包含两行。

  2. Switch包含正则表达式:^Q[12]^Q[34]

  3. 然后将步骤2的每个输出应用于水平重复分割, 这将每个段划分为单个行。 然后根据色谱柱长度应用多次分裂。

  4. 附有拆分和制图图供参考。
    Split Diagram
    Mapping Diagram

    通过映射生成的

    实际XML 文件如下:

    <Statement>
        <StatementDetails>
            <Q1>
                <cIdentifier>Q1</cIdentifier>
                <sNumber>2222222222</sNumber>
            </Q1>
        </StatementDetails>
        <StatementDetails>
            <Q2>
                <cIdentifier>Q2</cIdentifier>
                <antiDumpingDuty>1111111111</antiDumpingDuty>
            </Q2>
        </StatementDetails>
        <StatementDetails>
            <Q1>
                <cIdentifier>Q1</cIdentifier>
                <sNumber>3333333333</sNumber>
            </Q1>
        </StatementDetails>
        <StatementDetails>
            <Q2>
                <cIdentifier>Q2</cIdentifier>
                <antiDumpingDuty>4444444444</antiDumpingDuty>
            </Q2>
        </StatementDetails>
        <FinalStatement>
            <Q3>
                <cIdentifier>Q3</cIdentifier>
                <sNumber>5555555555</sNumber>
            </Q3>
        </FinalStatement>
        <FinalStatement>
            <Q4>
                <cIdentifier>Q4</cIdentifier>
                <antiDumpingDuty>6666666666</antiDumpingDuty>
            </Q4>
        </FinalStatement>
    </Statement>
    

    请有人建议结构或映射中出现什么问题?提前谢谢。

1 个答案:

答案 0 :(得分:0)

当你连接&#34; RepeatedSplit - 水平&#34; to&#34; StatementDetails&#34;,您的映射将创建一个&#34; StatementDetails&#34;每次事件标记&#34; RepeatedSplit - 水平&#34;找到了。

这可以解释为什么Q1和Q2没有分组。

我建议你删除这个连接,而是从&#34; ROW Q1&#34;开始添加第二个连接。 to&#34; StatementDetails&#34;。

我想它应该创建&#34; StatementDetails&#34;仅在&#34; Q1&#34;找到了。

我现在无法测试我提出的解决方案。

可以测试并告诉我们它是否适合您?