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

您正在尝试抓取“cat[1]”,但没有元素“cat”,它只是一个前缀。我相信你想要“目录”。此外,您还必须为“数字”子项添加命名空间前缀。而且我认为您编写声明命名空间的方式也不正确。那里不需要“xmlns:cat=”。

换句话说:

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

...应该工作。但是 podiluska 的前缀更改更合适,因为“ns”没有给出任何关于您正在使用的命名空间的提示。要记住的重要一点是前缀是任意的(它可以是任何东西),但您必须将它绑定到该名称空间中您想要的任何元素。

于 2012-09-20T13:35:11.597 回答
3

尝试

Select @xml.value('declare namespace cat="http://datypic.com/cat"; 
    (/cat:catalog/cat:number)[1]','int')
于 2012-09-20T13:57:01.360 回答
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 回答