代码之家  ›  专栏  ›  技术社区  ›  Richard Hansell

sqlxmlBulkLoad实用工具不适用于我的XML中的命名空间

  •  1
  • Richard Hansell  · 技术社区  · 7 年前

    所以我有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>
    

    当我通过sqlxmlblkload实用程序推送它时,它不会引发错误,但在我的数据库中什么也不会结束。

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

    • 移除 ns6: 命名空间从 <ns6:Responses 在XML中并删除 msdata:Prefix="ns6" 从XSD;
    • 添加 ns6 MessageReference 在XML中,即 <ns6:MessageReference> .

    我的猜测是,处理过程期望 ns6:Responses 也可加前缀 NS6 ,但它们不在我的XML中,我无法更改。

    我尝试过以下方法,但不起作用:

    • 补充 msdata:Prefix="" 消息引用 xsd中的元素;
    • 移除 msdata:prefix=“ns6” 完全来自XSD;
    • 以多种方式晃动名称空间。

    问题是我可以更改XSD,但不能更改XML。所以我的两个工作解决方案对我来说都不好,因为它们都涉及到对XML的更改。

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   Richard Hansell    7 年前

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

    有两种方法可以解决这个问题,要么改变 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>