SQLXMLBULKLOAD 实用程序不适用于我的 XML 中的命名空间
SQLXMLBULKLOAD Utility doesn't work with the namespace in my XML
所以我有 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:Responses
中删除 ns6:
命名空间,并从 XSD; 中删除 msdata:Prefix="ns6"
- 将
ns6
添加到XML中的MessageReference
,即<ns6:MessageReference>
.
我的猜测是处理期望 ns6:Responses
中的元素也以 ns6
为前缀,但它们不在我的 XML 中,我不能改变这个。
我试过以下方法,但没有用:
- 将
msdata:Prefix=""
添加到 XSD 中的 MessageReference
元素;
- 从 XSD 中完全删除了
msdata:Prefix="ns6"
;
- 以多种方式调整命名空间。
问题是我可以更改 XSD,但无法更改 XML。所以我的两个工作解决方案对我来说都不好,因为它们都涉及对 XML.
的更改
我知道我可以预处理 XML,删除 ns6:
命名空间或将其添加到所有元素,但我想尝试避免这种情况。
嗯,这是一个相当令人失望的回答,但我自己解决了这个问题。
有两种方法可以解决此问题,将 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>
所以我有 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:Responses
中删除ns6:
命名空间,并从 XSD; 中删除 - 将
ns6
添加到XML中的MessageReference
,即<ns6:MessageReference>
.
msdata:Prefix="ns6"
我的猜测是处理期望 ns6:Responses
中的元素也以 ns6
为前缀,但它们不在我的 XML 中,我不能改变这个。
我试过以下方法,但没有用:
- 将
msdata:Prefix=""
添加到 XSD 中的MessageReference
元素; - 从 XSD 中完全删除了
msdata:Prefix="ns6"
; - 以多种方式调整命名空间。
问题是我可以更改 XSD,但无法更改 XML。所以我的两个工作解决方案对我来说都不好,因为它们都涉及对 XML.
的更改我知道我可以预处理 XML,删除 ns6:
命名空间或将其添加到所有元素,但我想尝试避免这种情况。
嗯,这是一个相当令人失望的回答,但我自己解决了这个问题。
有两种方法可以解决此问题,将 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>