1

使用 SSIS XML Source 我想阅读以下 XML

<Stock>
  <OnHand>1</OnHand>
  <Proximity>xx</Proximity>
  <Reserved>2</Reserved>
  <Proximity>yy</Proximity>
  <OnOrder>3</OnOrder>
  <Proximity>zz</Proximity>
  <Cbo>4</Cbo>
  <Proximity>zz</Proximity>
</Stock>

XML 无法更改,因为它是一个名为Onix.

如您所见,每行后面都有一个 Proximity。

我想以某种方式以正确的顺序存储它们,或者在OnHandfor之后调用 Proximity OnHandProximity

此 XML 之后的架构如下所示:

<xs:sequence>
  <xs:element ref="OnHand" />
  <xs:element minOccurs="0" ref="Proximity" />
  <xs:sequence minOccurs="0">
    <xs:element ref="Reserved" />
    <xs:element minOccurs="0" ref="Proximity" />
  </xs:sequence>
  <xs:sequence minOccurs="0">
    <xs:element ref="OnOrder" />
    <xs:element minOccurs="0" ref="Proximity" />
  </xs:sequence>
  <xs:sequence minOccurs="0">
    <xs:element ref="CBO" />
    <xs:element minOccurs="0" ref="Proximity" />
  </xs:sequence>
</xs:sequence>

不幸的是,这在 SSIS XML Source 中正确给出了这个错误:

XML 源无法处理 XML 数据。模棱两可的 complexType 定义。元素“stock”有多个名为“Proximity”的成员。

我的问题当然是是否有人对这样处理 XML 有建议,而不会丢失相对位置的信息。

还有一些细节表明线条不是强制性的,但我认为第一个解决方案可以忽略该细节。

4

2 回答 2

1

Use Script Component as Source

XML Source doesn't support these types of XML files, you should add a Script Component as Source, Use a C# script to deserialize the XML file using System.Xml namespace or similar assemblies and Generate the Output Rows. You can pass the XML file path using Variables to the Script.

Helpful links

Similar Issue

Check this link, it may contains some workaround

Using Script Component as Source

Handling ONIX Xml in .Net

于 2019-03-14T20:54:57.927 回答
1

解决方法可能是在导入之前转换 XML。考虑执行以下操作。

由于我在样式表转换方面不是最好的 - 请随时发表评论或提供更好的解决方案。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Stock/OnHand">
        <xsl:element name="./OnHand">
            <xsl:element name="OnHandValue">
                <xsl:value-of select="current()"/>
            </xsl:element>
            <xsl:element name="OnHandProximity">
                <xsl:choose>
                    <xsl:when test="following-sibling::*[1][self::Proximity]" >
                        <xsl:value-of select="following-sibling::*[1]" />
                    </xsl:when>
                </xsl:choose>
            </xsl:element>
        </xsl:element>
    </xsl:template> 
    <xsl:template match="Stock/Reserved">
        <xsl:element name="Reserved">
            <xsl:element name="ReservedValue">
                <xsl:value-of select="current()"/>
            </xsl:element>
            <xsl:element name="ReservedProximity">
                <xsl:choose>
                    <xsl:when test="following-sibling::*[1][self::Proximity]" >
                        <xsl:value-of select="following-sibling::*[1]" />
                    </xsl:when>
                </xsl:choose>
            </xsl:element>
        </xsl:element>
    </xsl:template> 
    <xsl:template match="Stock/OnOrder">
        <xsl:element name="OnOrder">
            <xsl:element name="OnOrderValue">
                <xsl:value-of select="current()"/>
            </xsl:element>
            <xsl:element name="OnOrderProximity">
                <xsl:choose>
                    <xsl:when test="following-sibling::*[1][self::Proximity]" >
                        <xsl:value-of select="following-sibling::*[1]" />
                    </xsl:when>
                </xsl:choose>
            </xsl:element>
        </xsl:element>
    </xsl:template> 
    <xsl:template match="Stock/CBO">
        <xsl:element name="CBO">
            <xsl:element name="CBOValue">
                <xsl:value-of select="current()"/>
            </xsl:element>
            <xsl:element name="CBOProximity">
                <xsl:choose>
                    <xsl:when test="following-sibling::*[1][self::Proximity]" >
                        <xsl:value-of select="following-sibling::*[1]" />
                    </xsl:when>
                </xsl:choose>
            </xsl:element>
        </xsl:element>
    </xsl:template> 

    <xsl:template match="Stock/Proximity" />
</xsl:stylesheet>   
于 2019-03-15T09:36:31.150 回答