【问题标题】:Parsing SQL with bad xml namespace使用错误的 xml 命名空间解析 SQL
【发布时间】:2012-12-13 21:38:56
【问题描述】:

您好,我有以下 SQL 来尝试解析 xml 并提取“OrderNumber”。我遇到的问题是这个 xml(我无法控制)有一个奇怪的 xml 命名空间。我只是为了这个例子把它改成了 abc.com,但它是别的东西。无论如何,当存在该命名空间时,T-SQL 在结果中返回空值。所以它不能很好地与命名空间配合使用。如果我手动删除命名空间或通过 T-SQL 进行搜索和替换,它工作得很好。我想我可以做一个搜索和替换,但那个解决方案让我很困扰。想知道是否有其他人现在有更好的解决方法?也许可以解释为什么它不喜欢命名空间?非常感谢一些建议。谢谢!

Declare  @Transmission xml

set  @Transmission = '<Transmission>
  <Requests>
    <SubmitOrdersRequest>
      <Orders>
        <Order xmlns="http://www.abc.com">
          <OrderNumber>123</OrderNumber>
        </Order>
      </Orders>
    </SubmitOrdersRequest>
  </Requests>
</Transmission>'

select @Transmission.value('(Transmission/Requests/SubmitOrdersRequest/Orders/Order/OrderNumber/text())[1]', 'varchar(100)')

【问题讨论】:

    标签: sql xml tsql xml-parsing


    【解决方案1】:

    子节点继承父节点的命名空间,除非自己给定命名空间。您必须使用WITH XMLNAMESPACES 定义命名空间,并使用它们正确限定节点名称。

    Declare  @Transmission xml
    set  @Transmission = '<Transmission>
      <Requests>
        <SubmitOrdersRequest>
          <Orders>
            <Order xmlns="http://www.abc.com">
              <OrderNumber>123</OrderNumber>
            </Order>
          </Orders>
        </SubmitOrdersRequest>
      </Requests>
    </Transmission>';
    
    with xmlnamespaces('http://www.abc.com' as ns1)
    select @Transmission.value('(Transmission/Requests/SubmitOrdersRequest/Orders/ns1:Order/ns1:OrderNumber/text())[1]', 'varchar(100)')
    

    注意:命名空间的原因是名称是上下文的东西。 Order 在您的情况下可能意味着购买,但在另一种情况下,它可能意味着展示架订单。命名空间使名称更具唯一性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-03
      • 2014-01-10
      • 1970-01-01
      • 2010-11-08
      • 2018-07-15
      相关资源
      最近更新 更多