0

cat の値を取得しようとしていますが、null が返されます。この値を取得するのを手伝ってください。前もって感謝します!

DECLARE @xml XML 
SET @xml = '
<cat:catalog xmlns:cat="http://datypic.com/cat"
             xmlns:prod="http://datypic.com/prod">
  <cat:number>1446</cat:number>
  <prod:product>
    <prod:number>563</prod:number>
    <prod:name prod:language="en">Floppy Sun Hat</prod:name>
  </prod:product>
</cat:catalog>'

Select @xml.value('declare namespace ns="xmlns:cat=http://datypic.com/cat"; /ns:cat[1]/number[1]', 'int')
4

3 に答える 3

3

試す

Select @xml.value('declare namespace cat="http://datypic.com/cat"; 
    (/cat:catalog/cat:number)[1]','int')
于 2012-09-20T13:57:01.360 に答える
3

「cat[1]」を取得しようとしていますが、要素「cat」はありません。これは単なるプレフィックスです。あなたは「カタログ」が欲しいと思います。また、「番号」の子にも名前空間のプレフィックスを付ける必要があります。そして、declare namespace を書いた方法も間違っていると思います。そこに「xmlns:cat=」は必要ありません。

言い換えると:

Select @xml.value('declare namespace ns="http://datypic.com/cat"; /ns:catalog[1]/ns:number[1]', 'int')

...動作するはずです。ただし、「ns」は使用している名前空間についてのヒントを提供しないため、podiluska のプレフィックスの変更の方が適切です。心に留めておくべき重要なことは、プレフィックスは任意 (何でもかまいません) ですが、その名前空間で必要な要素に関連付ける必要があるということです。

于 2012-09-20T13:35:11.597 に答える
1

WITH XMLNAMESPACESを使用してこれを行うこともできます。これにより、.valueへの単一の呼び出しではなく、ステートメント全体に名前空間宣言が適用されます。これは、XMLから複数の値を取得する必要がある場合に役立ちます。

DECLARE @xml XML  
SET @xml = '<cat:catalog xmlns:cat="http://datypic.com/cat" xmlns:prod="http://datypic.com/prod">
  <cat:number>1446</cat:number>
  <prod:product>
    <prod:number>563</prod:number>
    <prod:name prod:language="en">Floppy Sun Hat</prod:name>
  </prod:product>
</cat:catalog>' 

;WITH XMLNAMESPACES (
'http://datypic.com/cat' AS cat,
'http://datypic.com/prod' AS prod
)
SELECT 
    c.c.value('(cat:number/text())[1]', 'INT') 'cat:number',
    p.c.value('(prod:number/text())[1]', 'INT') 'prod:number',
    p.c.value('(prod:name/@prod:language)[1]', 'VARCHAR(2)') 'prod:language',
    p.c.value('(prod:name/text())[1]', 'VARCHAR(50)') 'prod:name'
FROM @xml.nodes('cat:catalog') c(c)
    CROSS APPLY c.c.nodes('prod:product') p(c)
于 2012-09-20T23:58:36.277 に答える