xquery获取节点值

时间:2012-09-20 13:20:18

标签: xml xquery xquery-sql

我正在尝试获取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')

1 个答案:

答案 0 :(得分: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)