为sp_xml_preparedocument配置名称空间

时间:2013-07-18 19:14:06

标签: sql sql-server xml xml-namespaces

我有一个这种格式的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/"/>'

但它只解析第一个项目并忘记其余部分! 有什么想法吗?

2 个答案:

答案 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不包含此类声明也是如此。

http://msdn.microsoft.com/en-us/library/ms187367.aspx

答案 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);

SQL Fiddle