2012-09-20 109 views
0

我試圖獲得貓的價值,但它回報我空。請幫助我獲得這個價值。提前致謝!xquery獲取節點值

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') 

回答

2

您試圖抓住「貓[1]」,但沒有元素「貓」,它只是一個前綴。你想要「目錄」我相信。此外,您還必須爲「數字」子項添加名稱空間。你寫的聲明命名空間的方式也是我認爲不正確的。在那裏不需要「xmlns:cat =」。

換句話說:

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

...應該工作。但podiluska的前綴更改更合適,因爲「ns」不提供有關正在使用的命名空間的任何提示。要記住的重要一點是前綴是任意的(可以是任何東西),但是你必須將它綁定到你想要的那個名字空間中的任何元素。

+0

感謝您的回覆!我想獲得cat:數字值。好吧,我用Select @ xml.value('/ catalog [1]/cat [1]','int')替換最後一行,但是stil得到null。 – JohnyMotorhead

+0

是的,這項工作太棒了!感謝你們的幫助! – JohnyMotorhead

2

嘗試

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

這就像一個魅力工作!非常感謝你! – JohnyMotorhead

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) 
+0

感謝鮑勃!這是一個很好的提示,也許我會用它! – JohnyMotorhead