SQLXMLBULKLOAD 实用程序不适用于我的 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",要么向不在ns6命名空间中的每个元素添加form="unqualified"

所以方法 #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>

最新更新