SQLXMLBULKLOAD实用程序不适用于我的XML中的名称空间

时间:2018-08-28 12:09:53

标签: c# xml xsd sqlxml bulk-load

所以我有不能更改的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>

我使用带有SQL注释的手工XSD,而与此相关的部分是:

  <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实用程序推送此消息时,它不会引发错误,但是在我的数据库中没有任何结果。

如果执行以下操作之一,我可以使它工作:

  • 从XML中的ns6:删除<ns6:Responses命名空间,并从XSD删除msdata:Prefix="ns6"
  • ns6添加到XML的MessageReference中,即使此<ns6:MessageReference>

我的猜测是,处理过程期望ns6:Responses中的元素也以ns6为前缀,但是它们不在我的XML中,因此我无法更改。

我尝试了以下操作,但没有用:

  • 在XSD的msdata:Prefix=""元素中添加了MessageReference
  • 完全从XSD中删除了msdata:Prefix="ns6"
  • 以多种方式晃动名称空间。

问题是我可以更改XSD,但不能更改XML。因此,我的两个可行的解决方案对我都不利,因为它们都涉及对XML的更改。

我知道我可以预处理XML,可以删除ns6:名称空间,也可以将其添加到所有元素中,但是我想尝试避免这种情况。

1 个答案:

答案 0 :(得分:1)

一个令人失望的回答,但是我自己解决了这个问题。

有两种方法可以解决此问题,或者将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>