0

Google サイト マップを動的に生成する簡単なスクリプトの作成に取り組んでいますが、小さな問題があります。Google の通常のサイト マップを表示すると、メインのルート要素内に以下の行が見つかりました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

PHP を使用してサイト マップを作成していDOMdocumentますが、このヘッダーまたはコードをメインの子に追加する方法を知る必要があります。
これは私のコードです:

$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' の宣言が見つかりません。

これは、ヘッダーの欠落が原因だと思います。

4

1 に答える 1

1

Google サイトマップの<urlset>要素は、URI を持つ XML 名前空間内にありますhttp://www.sitemaps.org/schemas/sitemap/0.9

したがって、その要素を作成するときは、その名前空間内に作成する必要があります。そのためには、名前空間 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 スキーマ インスタンスの 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 では、改行を数値エンティティとしてエンコードせずに属性値の内部に挿入することはできません。したがって、ドキュメントが読み戻されるときに同等の単一のスペースを使用しました。

お役に立てれば。

関連している:

于 2013-03-17T14:45:08.150 に答える