我有一个这种格式的RSS xml:
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
<channel>
<title></title>
<link></link>
<description></description>
<language></language>
<lastBuildDate></lastBuildDate>
<generator></generator>
<docs></docs>
<managingEditor></managingEditor>
<webMaster></webMaster>
<ttl></ttl>
<item>
<title></title>
<link></link>
<description></description>
<guid isPermaLink="false"></guid>
<pubDate></pubDate>
<author></author>
<dc:date></dc:date>
<dc:publisher></dc:publisher>
<dc:language></dc:language>
</item>
<item>
<title></title>
<link></link>
<description></description>
<guid isPermaLink="false"></guid>
<pubDate></pubDate>
<author></author>
<dc:date></dc:date>
<dc:publisher></dc:publisher>
<dc:language></dc:language>
</item>
</channel>
</rss>
我想在SQLServer中使用sp_xml_preparedocument解析它。 我的问题是“namespce”字段。每个项目中有三个标签,它们都有命名空间,我不知道如何指定它们。 我试过这个:
EXEC sp_xml_preparedocument @hDoc OUTPUT, @xmlContent,'<item xmlns:dc="http://purl.org/dc/elements/1.1/"/>'
但它只解析第一个项目并忘记其余部分! 有什么想法吗?
答案 0 :(得分:2)
命名空间需要定义为字符类型:
EXEC sp_xml_preparedocument @hDoc OUTPUT, @xmlContent,'<item xmlns:dc="http://purl.org/dc/elements/1.1/"/>'
[xpath_namespaces] 指定在OPENXML中的行和列XPath表达式中使用的名称空间声明。 xpath_namespaces是一个文本参数:char,nchar,varchar,nvarchar,text,ntext或xml。
默认值为。 xpath_namespaces通过格式良好的XML文档为OPENXML中的XPath表达式中使用的前缀提供名称空间URI。 xpath_namespaces声明必须用于引用命名空间urn的前缀:schemas-microsoft-com:xml-metaprop;这提供了有关已解析的XML元素的元数据。虽然您可以使用此技术重新定义元属性命名空间的命名空间前缀,但此命名空间不会丢失。前缀mp对于urn仍然有效:schemas-microsoft-com:xml-metaprop,即使xpath_namespaces不包含此类声明也是如此。
答案 1 :(得分:2)
您只获得一行这一事实与命名空间无关。您在针对@hDoc
的openxml查询中出现了一些错误。
您可能仍有理由继续使用openxml,但在您显示不适合您的查询之前,我建议您使用XML数据类型。
with xmlnamespaces('http://purl.org/dc/elements/1.1/' as dc)
select C.N.value('(title/text())[1]', 'nvarchar(100)') as channel_title,
I.N.value('(title/text())[1]', 'nvarchar(100)') as item_title,
I.N.value('(dc:publisher/text())[1]', 'nvarchar(100)') as publisher
from @XML.nodes('/rss/channel') as C(N)
cross apply C.N.nodes('item') as I(N);