将Google站点地图标题添加到根元素


adding google sitemap header to the root element?

我正在创建一个简单的脚本来动态生成谷歌网站地图,但我有一个小问题,当我查看正常的谷歌网站地图时,我发现主根元素内的这些行,称为urlset:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 
http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" 
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9

我正在通过DOMdocument PHP创建网站地图,我需要知道如何将此标题或代码添加到我的主要孩子?
这是我的代码:

$doc = new DOMDocument('1.0', 'UTF-8');
$map = $doc->createElement('urlset');
$map = $doc->appendChild($map);
$url = $map->appendChild($doc->createElement('url'));
$url = $map->appendChild($doc->appendChild($url));
$url->appendChild($doc->createElement('loc',$link));
$url->appendChild($doc->createElement('lastmod',$date));
$url->appendChild($doc->createElement('priority',$priority));
$doc->save('sitemap.xml');

代码工作正常,生成XML文件没有问题,但当我试图通过验证它来检查站点地图的有效性时,它给出了这个错误

元素'urlset':没有匹配的全局声明可用于验证根或找不到urlset元素的声明

我认为这是由于缺少标题造成的

Google Sitemap中的<urlset>元素位于URI http://www.sitemaps.org/schemas/sitemap/0.9的XML命名空间内。

因此,当您创建该元素时,您需要在该名称空间中创建它。为此,您需要名称空间URI和方法DOMDocument::createElementNS() Docs:

const NS_URI_SITE_MAP = 'http://www.sitemaps.org/schemas/sitemap/0.9';
$doc = new DOMDocument('1.0', 'UTF-8');
$map = $doc->createElementNS(NS_URI_SITE_MAP, 'urlset');
$map = $doc->appendChild($map);

这已经创建了以下XML文档:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"/>

下一部分是为验证添加XML Schema Instance Schemalocation属性。它是在自己的命名空间中的属性所以属性需要在命名空间中创建然后添加到$map根元素:

const NS_URI_XML_SCHEMA_INSTANCE = 'http://www.w3.org/2001/XMLSchema-instance';
const NS_PREFIX_XML_SCHEMA_INSTANCE = 'xsi';
$schemalocation = $doc->createAttributeNS(
    NS_URI_XML_SCHEMA_INSTANCE,
    NS_PREFIX_XML_SCHEMA_INSTANCE . ':schemaLocation'
);
$schemaLocation->value = sprintf('%1s %1$s.xsd', NS_URI_SITE_MAP);
$schemaLocation        = $map->appendChild($schemaLocation);

然后将文档扩展到(漂亮打印):

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
                            http://www.sitemaps.org/schemas/sitemap/0.9.xsd"/>

据我所知,DOMDocument不可能在属性值中插入换行符,而不将它们编码为数字实体。因此,我使用了一个空格,当文档被读回时,它相当于

希望对你有帮助。

相关:

    xsi:schemaLocation的用途是什么?