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