Загрузить XML с помощью служб SSIS — DTD запрещен в этой ошибке XML-документа

Надеюсь, у вас все хорошо.

Ранее я задавал вопрос как импортировать файл XML в SQL Server. спасибо всем вам за ответы.

Поскольку мой исходный файл содержит большой объем данных, я пытаюсь загрузить его с помощью SSIS. Ниже приведены шаги, которые я выполнил:

  1. Импорт XML с помощью BulkLoad в столбец типа XML
  2. Создал схему XSD из этого файла XML в SQL Server
  3. Теперь в службах SSIS используется источник XML и предоставляется схема XML для сопоставления с назначением OLEDB.

Но казнь не удалась, сказав

"Ошибка: 0xC02090E7 при загрузке XML, источник XML 1 : компоненту "Источник XML" (1) не удалось прочитать XML-данные. Использование DTD в этом XML-документе запрещено."

BOL говорит, что SSIS не поддерживает DTD, и мы никак не можем избежать DTD в моем исходном файле.

Пожалуйста, помогите мне решить эту проблему.

Вот мой файл XML:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE _line_feed [
<!ELEMENT FeedTime (#PCDATA)>
<!ELEMENT lastContest (#PCDATA)>
<!ELEMENT lastGame (#PCDATA)>
<!ELEMENT contest_maximum (#PCDATA)>
<!ELEMENT contestantnum (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT event (event_datetimeGMT, gamenumber, sporttype, league, contest_maximum?, description?, (participants |  periods | total)+)>
<!ELEMENT event_datetimeGMT (#PCDATA)>
<!ELEMENT gamenumber (#PCDATA)>
<!ELEMENT league (#PCDATA)>
<!ELEMENT odds (moneyline_value, to_base?)>
<!ELEMENT over_adjust (#PCDATA)>
<!ELEMENT participants (participant*)>
<!ELEMENT participant (participant_name, contestantnum, rotnum, visiting_home_draw?, odds?, pitcher?)>
<!ELEMENT participant_name (#PCDATA)>
<!ELEMENT periods (period*)>
<!ELEMENT period (period_number, period_description, periodcutoff_datetimeGMT, period_status, period_update, spread_maximum?, moneyline_maximum?, total_maximum?, moneyline?, spread?, total?)>
<!ELEMENT period_number (#PCDATA)>
<!ELEMENT period_description (#PCDATA)>
<!ELEMENT period_status (#PCDATA)>
<!ELEMENT period_update (#PCDATA)>
<!ELEMENT periodcutoff_datetimeGMT (#PCDATA)>
<!ELEMENT _line_feed (FeedTime, lastContest, lastGame, events)>
<!ELEMENT events (event*)>
<!ELEMENT pitcher (#PCDATA)>
<!ELEMENT rotnum (#PCDATA)>
<!ELEMENT sporttype (#PCDATA)>
<!ELEMENT moneyline (moneyline_visiting, moneyline_home, moneyline_draw?)>
<!ELEMENT moneyline_value (#PCDATA)>
<!ELEMENT moneyline_visiting (#PCDATA)>
<!ELEMENT moneyline_home (#PCDATA)>
<!ELEMENT moneyline_draw (#PCDATA)>
<!ELEMENT moneyline_maximum (#PCDATA)>
<!ELEMENT spread (spread_visiting, spread_adjust_visiting, spread_home, spread_adjust_home)>
<!ELEMENT spread_adjust_home (#PCDATA)>
<!ELEMENT spread_adjust_visiting (#PCDATA)>
<!ELEMENT spread_home (#PCDATA)>
<!ELEMENT spread_maximum (#PCDATA)>
<!ELEMENT spread_visiting (#PCDATA)>
<!ELEMENT to_base (#PCDATA)>
<!ELEMENT total (total_points, over_adjust?, under_adjust?, units?)>
<!ELEMENT total_maximum (#PCDATA)>
<!ELEMENT total_points (#PCDATA)>
<!ELEMENT under_adjust (#PCDATA)>
<!ELEMENT units (#PCDATA)>
<!ELEMENT visiting_home_draw (#PCDATA)>
]>

<_line_feed>
    <FeedTime>1279783821193</FeedTime>
    <lastContest>4118567</lastContest>
    <lastGame>58681915</lastGame>
<events>
<event>
    <event_datetimeGMT>2010-07-22 20:05</event_datetimeGMT>
    <gamenumber>174201668</gamenumber>
    <sporttype>Tennis</sporttype>
    <league>M Atlanta 16</league>
    <participants>
        <participant>
            <participant_name>A. Roddick</participant_name>
            <contestantnum>4333</contestantnum>
            <rotnum>4333</rotnum>
            <visiting_home_draw>Visiting</visiting_home_draw>
        </participant>
        <participant>
            <participant_name>R. Ram</participant_name>
            <contestantnum>4334</contestantnum>
            <rotnum>4334</rotnum>
            <visiting_home_draw>Home</visiting_home_draw>
        </participant>
    </participants>
    <periods>
        <period>
            <period_number>0</period_number>
            <period_description>Game</period_description>
            <periodcutoff_datetimeGMT>2010-07-22 20:05</periodcutoff_datetimeGMT>
            <period_status>I</period_status>
            <period_update>open</period_update>
            <spread_maximum>500</spread_maximum>
            <moneyline_maximum>1500</moneyline_maximum>
            <total_maximum>500</total_maximum>
            <moneyline>
                <moneyline_visiting>-1850</moneyline_visiting>
                <moneyline_home>1290</moneyline_home>
            </moneyline>
        </period>
        <period>
            <period_number>0</period_number>
            <period_description>Game</period_description>
            <periodcutoff_datetimeGMT>2010-07-22 20:05</periodcutoff_datetimeGMT>
            <period_status>O</period_status>
            <period_update>open</period_update>
            <spread_maximum>500</spread_maximum>
            <moneyline_maximum>2000</moneyline_maximum>
            <total_maximum>500</total_maximum>
            <spread>
                <spread_visiting>-5.5</spread_visiting>
                <spread_adjust_visiting>-124</spread_adjust_visiting>
                <spread_home>5.5</spread_home>
                <spread_adjust_home>106</spread_adjust_home>
            </spread>
            <total>
                <total_points>19.5</total_points>
                <over_adjust>113</over_adjust>
                <under_adjust>-132</under_adjust>
            </total>
        </period>
        <period>
            <period_number>1</period_number>
            <period_description>1st Set</period_description>
            <periodcutoff_datetimeGMT>2010-07-22 20:05</periodcutoff_datetimeGMT>
            <period_status>I</period_status>
            <period_update>open</period_update>
            <spread_maximum>5000</spread_maximum>
            <moneyline_maximum>250</moneyline_maximum>
            <total_maximum>5000</total_maximum>
            <moneyline>
                <moneyline_visiting>-675</moneyline_visiting>
                <moneyline_home>497</moneyline_home>
            </moneyline>
        </period>
    </periods>
</event>
<event>
    <event_datetimeGMT>2010-07-22 20:05</event_datetimeGMT>
    <gamenumber>174263209</gamenumber>
    <sporttype>Tennis</sporttype>
    <league>M Atlanta 16</league>
    <participants>
        <participant>
            <participant_name>I. Marchenko</participant_name>
            <contestantnum>4335</contestantnum>
            <rotnum>4335</rotnum>
            <visiting_home_draw>Visiting</visiting_home_draw>
        </participant>
        <participant>
            <participant_name>X. Malisse</participant_name>
            <contestantnum>4336</contestantnum>
            <rotnum>4336</rotnum>
            <visiting_home_draw>Home</visiting_home_draw>
        </participant>
    </participants>
    <periods>
        <period>
            <period_number>0</period_number>
            <period_description>Game</period_description>
            <periodcutoff_datetimeGMT>2010-07-22 20:05</periodcutoff_datetimeGMT>
            <period_status>O</period_status>
            <period_update>open</period_update>
            <spread_maximum>500</spread_maximum>
            <moneyline_maximum>2000</moneyline_maximum>
            <total_maximum>500</total_maximum>
            <moneyline>
                <moneyline_visiting>139</moneyline_visiting>
                <moneyline_home>-151</moneyline_home>
            </moneyline>
        </period>
        <period>
            <period_number>0</period_number>
            <period_description>Game</period_description>
            <periodcutoff_datetimeGMT>2010-07-22 20:05</periodcutoff_datetimeGMT>
            <period_status>O</period_status>
            <period_update>open</period_update>
            <spread_maximum>500</spread_maximum>
            <moneyline_maximum>2000</moneyline_maximum>
            <total_maximum>500</total_maximum>
            <spread>
                <spread_visiting>2</spread_visiting>
                <spread_adjust_visiting>100</spread_adjust_visiting>
                <spread_home>-2</spread_home>
                <spread_adjust_home>-117</spread_adjust_home>
            </spread>
            <total>
                <total_points>22.5</total_points>
                <over_adjust>-108</over_adjust>
                <under_adjust>-108</under_adjust>
            </total>
        </period>
        <period>
            <period_number>1</period_number>
            <period_description>1st Set</period_description>
            <periodcutoff_datetimeGMT>2010-07-22 20:05</periodcutoff_datetimeGMT>
            <period_status>O</period_status>
            <period_update>open</period_update>
            <spread_maximum>5000</spread_maximum>
            <moneyline_maximum>500</moneyline_maximum>
            <total_maximum>5000</total_maximum>
            <moneyline>
                <moneyline_visiting>115</moneyline_visiting>
                <moneyline_home>-134</moneyline_home>
            </moneyline>
        </period>
    </periods>
</event>
<event>
    <event_datetimeGMT>2010-07-22 21:30</event_datetimeGMT>
    <gamenumber>174271178</gamenumber>
    <sporttype>Tennis</sporttype>
    <league>M Atlanta 16</league>
    <participants>
        <participant>
            <participant_name>K. Andersoõn</participant_name>
            <contestantnum>4341</contestantnum>
            <rotnum>4341</rotnum>
            <visiting_home_draw>Visiting</visiting_home_draw>
        </participant>
        <participant>
            <participant_name>D. Young</participant_name>
            <contestantnum>4342</contestantnum>
            <rotnum>4342</rotnum>
            <visiting_home_draw>Home</visiting_home_draw>
        </participant>
    </participants>
    <periods>
        <period>
            <period_number>0</period_number>
            <period_description>Game</period_description>
            <periodcutoff_datetimeGMT>2010-07-22 21:30</periodcutoff_datetimeGMT>
            <period_status>O</period_status>
            <period_update>open</period_update>
            <spread_maximum>500</spread_maximum>
            <moneyline_maximum>2000</moneyline_maximum>
            <total_maximum>500</total_maximum>
            <moneyline>
                <moneyline_visiting>-148</moneyline_visiting>
                <moneyline_home>136</moneyline_home>
            </moneyline>
        </period>
        <period>
            <period_number>0</period_number>
            <period_description>Game</period_description>
            <periodcutoff_datetimeGMT>2010-07-22 21:30</periodcutoff_datetimeGMT>
            <period_status>O</period_status>
            <period_update>open</period_update>
            <spread_maximum>500</spread_maximum>
            <moneyline_maximum>2000</moneyline_maximum>
            <total_maximum>500</total_maximum>
            <spread>
                <spread_visiting>-2</spread_visiting>
                <spread_adjust_visiting>-121</spread_adjust_visiting>
                <spread_home>2</spread_home>
                <spread_adjust_home>104</spread_adjust_home>
            </spread>
            <total>
                <total_points>22.5</total_points>
                <over_adjust>-111</over_adjust>
                <under_adjust>-105</under_adjust>
            </total>
        </period>
        <period>
            <period_number>1</period_number>
            <period_description>1st Set</period_description>
            <periodcutoff_datetimeGMT>2010-07-22 21:30</periodcutoff_datetimeGMT>
            <period_status>O</period_status>
            <period_update>open</period_update>
            <spread_maximum>5000</spread_maximum>
            <moneyline_maximum>500</moneyline_maximum>
            <total_maximum>5000</total_maximum>
            <moneyline>
                <moneyline_visiting>-126</moneyline_visiting>
                <moneyline_home>108</moneyline_home>
            </moneyline>
        </period>
    </periods>
</event>

...
...

</events>
</_line_feed>

Используемый файл схемы XSD:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="_line_feed">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="FeedTime" type="xs:unsignedLong" />
        <xs:element name="lastContest" type="xs:unsignedInt" />
        <xs:element name="lastGame" type="xs:unsignedInt" />
        <xs:element name="events">
          <xs:complexType>
            <xs:sequence>
              <xs:element maxOccurs="unbounded" name="event">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="event_datetimeGMT" type="xs:string" />
                    <xs:element name="gamenumber" type="xs:unsignedInt" />
                    <xs:element name="sporttype" type="xs:string" />
                    <xs:element name="league" type="xs:string" />
                    <xs:element minOccurs="0" name="contest_maximum" type="xs:unsignedShort" />
                    <xs:element minOccurs="0" name="description" type="xs:string" />
                    <xs:element name="participants">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element maxOccurs="unbounded" name="participant">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element name="participant_name" type="xs:string" />
                                <xs:element name="contestantnum" type="xs:unsignedInt" />
                                <xs:element name="rotnum" type="xs:unsignedShort" />
                                <xs:element minOccurs="0" name="odds">
                                  <xs:complexType>
                                    <xs:sequence>
                                      <xs:element name="moneyline_value" type="xs:string" />
                                      <xs:element name="to_base" type="xs:string" />
                                    </xs:sequence>
                                  </xs:complexType>
                                </xs:element>
                                <xs:element minOccurs="0" name="visiting_home_draw" type="xs:string" />
                                <xs:element minOccurs="0" name="pitcher" type="xs:string" />
                              </xs:sequence>
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                    <xs:element minOccurs="0" name="total">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="total_points" type="xs:decimal" />
                          <xs:element name="units" type="xs:string" />
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                    <xs:element minOccurs="0" name="periods">
                      <xs:complexType>
                        <xs:sequence minOccurs="0">
                          <xs:element maxOccurs="unbounded" name="period">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element name="period_number" type="xs:unsignedByte" />
                                <xs:element name="period_description" type="xs:string" />
                                <xs:element name="periodcutoff_datetimeGMT" type="xs:string" />
                                <xs:element name="period_status" type="xs:string" />
                                <xs:element name="period_update" type="xs:string" />
                                <xs:element name="spread_maximum" type="xs:unsignedShort" />
                                <xs:element name="moneyline_maximum" type="xs:unsignedShort" />
                                <xs:element name="total_maximum" type="xs:unsignedShort" />
                                <xs:element minOccurs="0" name="moneyline">
                                  <xs:complexType>
                                    <xs:sequence>
                                      <xs:element name="moneyline_visiting" type="xs:short" />
                                      <xs:element name="moneyline_home" type="xs:short" />
                                      <xs:element minOccurs="0" name="moneyline_draw" type="xs:unsignedShort" />
                                    </xs:sequence>
                                  </xs:complexType>
                                </xs:element>
                                <xs:element minOccurs="0" name="spread">
                                  <xs:complexType>
                                    <xs:sequence>
                                      <xs:element name="spread_visiting" type="xs:decimal" />
                                      <xs:element name="spread_adjust_visiting" type="xs:short" />
                                      <xs:element name="spread_home" type="xs:decimal" />
                                      <xs:element name="spread_adjust_home" type="xs:short" />
                                    </xs:sequence>
                                  </xs:complexType>
                                </xs:element>
                                <xs:element minOccurs="0" name="total">
                                  <xs:complexType>
                                    <xs:sequence>
                                      <xs:element name="total_points" type="xs:decimal" />
                                      <xs:element name="over_adjust" type="xs:short" />
                                      <xs:element name="under_adjust" type="xs:short" />
                                    </xs:sequence>
                                  </xs:complexType>
                                </xs:element>
                              </xs:sequence>
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

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

Спасибо, Прашант.


person Prashant    schedule 28.07.2010    source источник


Ответы (2)


Вы пытались загрузить необработанный XML в тип данных XML в таблице базы данных, а затем преобразование данных в таблицы базы данных с помощью хранимых процедур? Обычно я предпочитаю этот метод, чтобы сохранить исходный XML-код на случай, если что-то изменится в схеме, о чем я не знал во время импорта, например, если исходная система добавила в файл новые узлы. Если вы выберете этот подход, вы можете использовать sp_xml_preparedocument и < href="http://msdn.microsoft.com/en-us/library/ms186918.aspx" rel="nofollow noreferrer">OPENXML для преобразования данных. Обратите внимание, что OPENXML поддерживает DTD для вывода типов выходных данных.

person Registered User    schedule 28.07.2010
comment
В настоящее время я импортирую файл XML в переменную XML, а затем анализирую с помощью XQuery Nodes() и Value(). При попытке обновить весь процесс до SSIS возникает ошибка Prohibited DTD в XML-документе. Обратите внимание: мой исходный XML-файл содержит большой объем данных. - person Prashant; 29.07.2010

В SSRS эта ошибка может возникнуть при нехватке памяти. Не знаю, относится ли это и к SSIS. (Но вы прямо упоминаете большой файл, так что, возможно, это актуально. Вы можете попробовать с файлом меньшего размера).

Эта ссылка указывает, что вам придется сделать свой собственный обходной путь. Возможно, с некоторой предварительной обработкой файла XML?

person Tobiasopdenbrouw    schedule 29.07.2010
comment
Также попробовал то же самое с меньшим исходным файлом, но безуспешно !! - person Prashant; 29.07.2010