繁体   English   中英

为sp_xml_preparedocument配置名称空间

[英]Configuring namespace for sp_xml_preparedocument

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

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

命名空间需要定义为字符类型:

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

您只获得一行这一事实与命名空间无关。 您在针对@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小提琴

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM