Утилита SQLXMLBULKLOAD не работает с пространством имен в моем XML - PullRequest
0 голосов
/ 28 августа 2018

Итак, у меня есть XML, который я не могу изменить, и он выглядит примерно так:

<?xml version="1.0" encoding="UTF-8"?>
<ns6:Responses xmlns:ns6="http://www.yadayada" xmlns:ns2="http://www.yadayada" xmlns:ns3="http://www.w3.org/2000/09/xmldsig#" xmlns:ns4="http://www.yadayada" xmlns:ns5="http://www.yadayada">
  <MessageReference>824cf96b-6130-460c-a2d4-2adc3b6ea14d</MessageReference>
</ns6:Responses>

Я использую XSD, созданный вручную, с аннотациями SQL, и соответствующая часть выглядит так:

  <xs:element name="Responses" msdata:Prefix="ns6" sql:relation="Responses">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="MessageReference" type="xs:string" msdata:Prefix="ns6" sql:field="MessageReference" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

Когда я проталкиваю это через утилиту SQLXMLBULKLOAD, она не выдает ошибку, но в моей базе данных ничего не заканчивается.

Я могу заставить это работать, если я выполню одно из следующих действий:

  • удалить пространство имен ns6: из <ns6:Responses в XML и удалить msdata:Prefix="ns6" из XSD;
  • добавить ns6 к MessageReference в XML, то есть сделать это <ns6:MessageReference>.

Я предполагаю, что обработка ожидает, что элементы в ns6:Responses также будут иметь префикс ns6, но их нет в моем XML, и я не могу это изменить.

Я попробовал следующее, но это не сработало:

  • добавлено msdata:Prefix="" к элементу MessageReference в XSD;
  • полностью удалил msdata:Prefix="ns6" из XSD;
  • перемешивали пространства имен разными способами.

Проблема в том, что я могу изменить XSD, но я не могу изменить XML. Таким образом, два моих рабочих решения не годятся для меня, поскольку оба они включают изменения в XML.

Я знаю, что могу предварительно обработать XML, либо удалив пространство имен ns6:, либо добавив его ко всем элементам, но я хотел попытаться избежать этого.

1 Ответ

0 голосов
/ 29 августа 2018

Ну, довольно неутешительный ответ, но я сам решил это.

Есть два способа исправить это: изменить elementFormDefault="qualified" на elementFormDefault="unqualified" или добавить form="unqualified" к каждому элементу, который не находится в пространстве имен ns6.

Таким образом, метод № 1 состоит в том, чтобы изменить пространство имен msdata на: xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="unqualified".

Метод # 2 - изменить тело XSD на следующее:

  <xs:element name="Responses" msdata:Prefix="ns6" sql:relation="Responses">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="MessageReference" form="unqualified" type="xs:string" msdata:Prefix="ns6" sql:field="MessageReference" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
...