请参阅下面的SQL Server 2005脚本
Declare @xmlData XML
SET @xmlData = '<?xml version="1.0"?>
<bookstore xmlns="http://myBooks">
<book genre="autobiography" publicationdate="1981"
ISBN="1-861003-11-0">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel" publicationdate="1967"
ISBN="0-201-63361-2">
<title>The Confidence Man</title>
<author>
<first-name>Herman</first-name>
<last-name>Melville</last-name>
</author>
<price>11.99</price>
</book>
<book genre="philosophy" publicationdate="1991"
ISBN="1-861001-57-6">
<title>The Gorgias</title>
<author>
<first-name>Sidas</first-name>
<last-name>Plato</last-name>
</author>
<price>9.99</price>
</book>
</bookstore>'
Select T.Item.query('.')
From @xmlData.nodes('/bookstore/book') AS T(Item)
这个脚本应该给我所有书籍节点的列表。但它没有给出预期的行为。如果我删除XMLNS然后它工作正常。谁能解释一下?
以下工作正常。
Declare @xmlData XML
SET @xmlData = '<?xml version="1.0"?>
<bookstore>
<book genre="autobiography" publicationdate="1981"
ISBN="1-861003-11-0">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel" publicationdate="1967"
ISBN="0-201-63361-2">
<title>The Confidence Man</title>
<author>
<first-name>Herman</first-name>
<last-name>Melville</last-name>
</author>
<price>11.99</price>
</book>
<book genre="philosophy" publicationdate="1991"
ISBN="1-861001-57-6">
<title>The Gorgias</title>
<author>
<first-name>Sidas</first-name>
<last-name>Plato</last-name>
</author>
<price>9.99</price>
</book>
</bookstore>'
Select T.Item.query('.')
From @xmlData.nodes('/bookstore/book') AS T(Item)
任何人都可以解释我如何纠正第一次scritp?我想用xmlns运行脚本。
答案 0 :(得分:2)
正如您所说 - 这是因为您的原始XML数据位于XML命名空间中,如果是这种情况,您还需要在XQuery中使用该XML命名空间:
SELECT
T.Item.query('.')
FROM
@xmlData.nodes('declare namespace ns="http://myBooks";/ns:bookstore/ns:book')
AS T(Item)
您需要将declare namespace ns="http://myBooks";
部分插入到XQuery中,然后使用已定义的命名空间前缀ns
(您可以在此处使用任何内容)来引用XML对象。
马克