Использование хранилища XML SSIS Source относительно элементов XML - PullRequest
1 голос
/ 14 марта 2019

Использование источника XML SSIS Я хотел бы прочитать следующий 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.

Я бы хотел как-то сохранить их в правильном порядке или вызвать Proximity после OnHand для 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.Неоднозначное сложное определение типа.Элемент "stock" имеет несколько членов с именем "Proximity".

И мой вопрос, конечно, есть ли у кого-нибудь предложения по обработке XML-кода без потери информации об относительной позиции.

Также есть детали, что строки не являются обязательными, но я думаю, что первое решение может игнорировать эту деталь.

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Обходным путем может быть преобразование 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>   
1 голос
/ 14 марта 2019

Использовать компонент скрипта в качестве источника

Источник XML не поддерживает эти типы файлов XML, вы должны добавить компонент сценария в качестве источника, использовать сценарий C # для десериализации файла XML с использованием пространства имен System.Xml или аналогичных сборок и генерировать строки вывода. Вы можете передать путь к файлу XML с помощью переменных в скрипт.

Полезные ссылки

Аналогичный выпуск

Проверьте эту ссылку, она может содержать обходной путь

Использование компонента сценария в качестве источника

Обработка ONIX Xml в .Net

...