8

別のプロセス (変換や別のトリックなど) を使用せずに、データベースから直接サイトマップ xml ファイル (画像を含む) を作成したいと考えています。

私のクエリは次のとおりです。

;WITH XMLNAMESPACES(
    DEFAULT 'http://www.sitemaps.org/schemas/sitemap/0.9',
    'http://www.google.com/schemas/sitemap-image/1.1' as  [image] )  
SELECT  
    (SELECT             
        'mysite'    as [loc],
        (select   
            'anotherloc'
            as [image:loc]
        for XML path('image:image'), type
        )
    for xml path('url'), type
)
for xml path('urlset'), type

戻り値:

<urlset xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <loc>mysite</loc>
    <image:image xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
      <image:loc>anotherloc</image:loc>
    </image:image>
  </url>
</urlset>

しかし、名前空間宣言を繰り返さずに、この出力が必要です。

<urlset xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>mysite</loc>
    <image:image>
      <image:loc>anotherloc</image:loc>
    </image:image>
  </url>
</urlset>
4

3 に答える 3

3

追加の otiose 名前空間宣言によって XML ドキュメントの意味が変わることはないので、結果が XML 準拠のツールによって使用されるのであれば、それらは問題にならないはずです。それにもかかわらず、XML名前空間を正しく実行しないツールがいくつかあることを私は知っています。また、大きなXMLインスタンスでは、余分な名前空間宣言が繰り返されると、結果のサイズが大幅に肥大化する可能性があり、それ自体が問題を引き起こす可能性があります。

一般に、SQL Server 2012 までの SQL Server の XML をサポートするすべてのバージョンでSELECT...FOR XML、プレフィックスのスコープ内の各ステートメントが結果セットの最も外側の XML 要素で名前空間宣言を生成するという事実を回避することはできません。WITH XMLNAMESPACES

SELECT特定の例では、 s をネストするのではなく分離ROOTし、エンベロープルート要素の構文を使用することで、目的の XML にかなり近づけることができます。

DECLARE @inner XML;
WITH XMLNAMESPACES('http://www.google.com/schemas/sitemap-image/1.1' as  [image])   
SELECT @inner =
(   
    SELECT    
        'anotherloc' AS [image:loc] 
    FOR XML PATH('image:image'), TYPE 
)

;WITH XMLNAMESPACES( 
    DEFAULT 'http://www.sitemaps.org/schemas/sitemap/0.9'
)   
SELECT              
        'mysite'    AS [loc], 
        @inner
FOR XML PATH('url'), ROOT('urlset'), TYPE 

結果は次のとおりです。

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>mysite</loc>
    <image:image xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns="">
      <image:loc>anotherloc</image:loc>
    </image:image>
  </url>
</urlset>

しかし、このアプローチは、問題に対する完全に一般的な解決策を提供するものではありません。

于 2012-10-11T08:53:38.697 に答える
0

答えには遅すぎるかもしれませんが、これは迅速な解決策です。

`DECLARE @PageNumber Int = 1;
DECLARE @siteMapXml XML ;
; XMLNAMESPACES (
    'http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd' as "schemaLocation",
    「http://www.w3.org/2001/XMLSchema-instance」を xsi として、
    「http://www.google.com/schemas/sitemap-image/1.1」を [画像] として、
    デフォルト 'http://www.sitemaps.org/schemas/sitemap/0.9'
    )
        SELECT @siteMapXml = (

                                    選択する   
                                       スラッグロック、
                                       convert(varchar(300),[Image]) as [image:image/image:loc]
                                       、
                                       Convert(char(10), UpdatedOnUtc, 126) as lastmod,
                                       changefreqとして「毎時」、
                                       優先順位として「0.5」
                                    フロムプロダクツ(NOLOCK)
                                    WHERE ページ番号 = @PageNumber

XML パス ('url')、ルート ('urlset')) の場合
SELECT @siteMapXml = REPLACE(CAST(@siteMapXml AS NVARCHAR(MAX)), ' xmlns:schemaLocation=', ' xsi:schemaLocation=')
SELECT @siteMapXml`
于 2019-03-27T19:45:34.380 に答える