【问题标题】:How generate XML sitemap in SQL Server 2019?如何在 SQL Server 2019 中生成 XML 站点地图?
【发布时间】:2021-03-17 20:13:32
【问题描述】:

我想从 SQL Server 中生成站点地图,并使用以下产品表将其保存到我的系统驱动器:

样本数据

我尝试使用 FOR XML PATH 查询,但它没有给我正确的结果:

DECLARE @xml XML = (SELECT 
                        (SELECT 
                                '' AS "data()" 
                         FOR XML PATH ('loc'), TYPE),
                         (SELECT 
                                '' AS "data()" 
                         FOR XML PATH ('changefreq'), TYPE),
                         (SELECT 
                                '' AS "data()" 
                         FOR XML PATH ('priority'), TYPE),
                         
                                '' AS 'Name!1!ELEMENT' 
                    FROM dbo.product o 
                    FOR XML PATH ('url'), ROOT('dummyTag'), TYPE)

-- Magic happens here!       

    SELECT 1 AS Tag
          ,0 AS Parent
          ,@xml AS [urlset!1!!xmltext]
          ,'http://www.sitemaps.org/schemas/sitemap/0.9' AS [urlset!1!xmlns]
          ,'http://www.sitemaps.org/schemas/sitemap/0.9' AS [urlset!1!xmlns:image]
    FOR XML EXPLICIT

模板 xml:

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

我想要的是这样的结果:

<?xml version="1.0" encoding="UTF-8"?>
<urlset
    xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
    xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
    <url>
        <loc>https://www.example.com/product/dkp-4658551/%D9%85%D8%A7%D9%86%D8%AA%D9%88-%D8%B2%D9%86%D8%A7%D9%86%D9%87-27-%D9%85%D8%AF%D9%84-%DA%AF%D9%84-%D9%88-%D9%BE%D9%86%D8%AC%D8%B1%D9%87-%DA%A9%D8%AF-v78-%D8%B1%D9%86%DA%AF-%D8%B7%D9%88%D8%B3%DB%8C</loc>
        <changefreq>weekly</changefreq>
        <priority>0.8</priority>
        <image:image>
            <image:loc>https://example.com/mysite-products/3d1201f33f4e6dd6114ee6ec55be20fb5581f382_1615206830.jpg?x-oss-process=image/resize,m_lfit,h_350,w_350/quality,q_60</image:loc>
            <image:caption>مانتو زنانه 27 مدل گل و پنجره کد V78 رنگ طوسی</image:caption>
        </image:image>
    </url>
</urlset>

【问题讨论】:

  • 不是!我只想生成一个 XML 文件 @DaleK
  • 我从@DaleK产品表中读取数据
  • 好的。 @DaleK 检查我的问题
  • 请再次检查@DaleK
  • 在提出问题时,您需要提供一个可重现的最小示例。请参考以下链接:stackoverflow.com/help/minimal-reproducible-example 请提供以下内容: (1) DDL 和样本数据填充,即 CREATE table(s) 加上 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上面#1 中的样本数据。 (4) 你的 SQL Server 版本 (SELECT @@version;)

标签: sql sql-server tsql xquery sitemap


【解决方案1】:

由于没有提供 DDL 和样本数据总体,我冒昧地创建了它。

通过使用 XQuery 及其 FLWOR 表达式,可以轻松创建站点地图 XML。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE 
(
    ID INT IDENTITY PRIMARY KEY, 
    loc VARCHAR(2048), 
    changefreq VARCHAR(10),
    priority DECIMAL(2,1),
    image VARCHAR(2048),
    caption NVARCHAR(255)
);
INSERT INTO @tbl (loc, changefreq, priority, image, caption) VALUES
('https://example.com/product1', 'hourly', 0.5, 'https://example.com/asset/img1.jpg', N'caption1'),
('https://example.com/product2', 'daily', 0.2, 'https://example.com/asset/img2.jpg', N'caption2');
-- DDL and sample data population, end

;WITH XMLNAMESPACES(DEFAULT 'http://www.sitemaps.org/schemas/sitemap/0.9'
    , 'http://www.google.com/schemas/sitemap-image/1.1' AS [image])
SELECT (
    SELECT * 
    FROM @tbl
    FOR XML PATH('r'), TYPE, ROOT('root')
).query('<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
{
    for $x in /root/r
    return <url>
        <loc>{data($x/loc)}</loc>
        <changefreq>{data($x/changefreq)}</changefreq>
        <priority>{data($x/priority)}</priority>
        <image:image>
            <image:loc>{data($x/image)}</image:loc>
            <image:caption>{data($x/caption)}</image:caption>
        </image:image>
    </url>
}
</urlset>');

输出

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
  <url>
    <loc>https://example.com/product1</loc>
    <changefreq>hourly</changefreq>
    <priority>0.5</priority>
    <image:image>
      <image:loc>https://example.com/asset/img1.jpg</image:loc>
      <image:caption>caption1</image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://example.com/product2</loc>
    <changefreq>daily</changefreq>
    <priority>0.2</priority>
    <image:image>
      <image:loc>https://example.com/asset/img2.jpg</image:loc>
      <image:caption>caption2</image:caption>
    </image:image>
  </url>
</urlset>

【讨论】:

【解决方案2】:

以下内容还返回您需要的内容 - 对我来说似乎更简单。此外,如果您想添加版本和编码,我相信您可以做到的唯一方法是转换为字符串。

DECLARE @Xml XML = null, @XMLStr NVARCHAR(MAX) = '<?xml version="1.0" encoding="UTF-8"?>';

WITH XMLNAMESPACES (DEFAULT 'http://www.sitemaps.org/schemas/sitemap/0.9'
    , 'http://www.google.com/schemas/sitemap-image/1.1' AS image)  
SELECT @Xml = (SELECT loc, changefreq, [priority], [image] as [image:image/image:loc]
    , [caption] as [image:image/image:caption]
FROM (
  VALUES ('https://example.com/product1','https://example.com/asset/img1.jpg','title1', 10, 0.1)
      , ('https://example.com/product2','https://example.com/asset/img2.jpg','title1', 20, 0.2)
) P (loc, [image], caption, changefreq, [priority])
FOR XML PATH ('url'), ROOT('urlset'));

SELECT @Xml;

-- Convert to a string and add the `version` + `encoding` tag.
SELECT @XMLStr + CAST(@XML AS NVARCHAR(MAX));

返回:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://example.com/product1</loc>
    <changefreq>10</changefreq>
    <priority>0.1</priority>
    <image:image>
      <image:loc>https://example.com/asset/img1.jpg</image:loc>
      <image:caption>title1</image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://example.com/product2</loc>
    <changefreq>20</changefreq>
    <priority>0.2</priority>
    <image:image>
      <image:loc>https://example.com/asset/img2.jpg</image:loc>
      <image:caption>title1</image:caption>
    </image:image>
  </url>
</urlset>

注意:您没有提供更改频率和代表它的单词之间的映射。

【讨论】:

  • @NaderGharibianFard 注意,在阅读FOR XML PATH 上的文档之前,我从来没有这样做过——我相信你也可以这样做:)
  • 你帮了我很多,让我得到答案@Dale-K
猜你喜欢
  • 1970-01-01
  • 2016-09-06
  • 2017-11-29
  • 2014-06-11
  • 1970-01-01
  • 2015-08-11
  • 2012-10-17
  • 2017-02-03
  • 1970-01-01
相关资源
最近更新 更多