0

こんにちは私はxmlを解析して「OrderNumber」を抽出するために次のSQLを持っています。私が抱えている問題は、このxml(私は制御できません)に奇妙なxml名前空間があることです。この例のためだけにabc.comに変更しましたが、それは別のものです。とにかく、その名前空間が存在する場合、T-SQLは結果にnullを返します。そのため、名前空間とうまく連携しません。名前空間を手動で削除するか、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 に答える