0

您好我有以下 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)')
4

1 回答 1

0

子节点继承父节点的命名空间,除非自己给定命名空间。您必须使用 定义名称空间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在您的情况下可能意味着购买,但在另一种情况下,它可能意味着展示架订单。命名空间使名称更具唯一性。

于 2012-12-13T21:47:44.220 回答