3

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

但它只是解析第一项并忘记其余的!任何想法?

4

2 回答 2

2

您只得到一行的事实与命名空间无关。您的 openxml 查询中有一些错误@hDoc

您可能有理由仍然使用 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小提琴

于 2013-08-05T09:26:13.523 回答
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

于 2013-07-18T19:35:27.537 回答