Предполагается, что у меня есть текстовая база данных:
http://example.com,monthly,0.3
http://example.com/one,daily,0.5
http://example.com/two,weekly,0,8
Я хотел бы преобразовать в свою текстовую базу данных в sitemap.xml.
$fp = fopen('./database.txt', 'r');
$xml = new XMLWriter;
$xml->openURI('./sitemap.xml');
$xml->setIndent(true);
$xml->startElement('urlset');
while ($line = fgetcsv($fp)) {
if (count($line) < 4) continue;
$xml->startElement('url');
$xml->writeElement('loc', $line[0]);
$xml->writeElement('changefreq', $line[1]);
$xml->writeElement('priority', $line[2]);
echo $xliff->getDocument();
$xml->endElement();
}
$xml->endElement();
Я попробовал этот код, я не мог добавить эту часть …
<?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/sitemap.xsd">
Вы могли бы использовать http://php.net/manual/en/function.xmlwriter-start-attribute-ns.php
или используйте DOM:
$fp = fopen('./database.txt', 'r');
$dom = new DOMDocument();
$dom->formatOutput = true;
$urlset = $dom->createElementNS('http://www.sitemaps.org/schemas/sitemap/0.9', 'urlset');
$dom->appendChild($urlset);
while ($line = fgetcsv($fp)) {
var_dump($line);
$url = $dom->createElement('url');
$urlset->appendChild($url);
$url->appendChild($dom->createElement('loc', $line[0]));
$url->appendChild($dom->createElement('changefreq', $line[1]));
$url->appendChild($dom->createElement('priority', $line[2]));
}
echo $dom->saveXML();
xmlns='http://www.sitemaps.org/schemas/sitemap/0.9'
является определением пространства имен. Он определяет, что все узлы элемента (без префикса являются частью этого формата. Вы можете прочитать имена тегов элемента как {http://www.sitemaps.org/schemas/sitemap/0.9}:urlset
, {http://www.sitemaps.org/schemas/sitemap/0.9}:url
…
Это позволяет смешивать форматы XML без конфликтов.
Чтобы создать узел XML с устройством чтения XML, для которого требуется определение пространства имен, вам придется использовать * NS-варианты методов. Это немного отличается от DOM, где вы всегда предоставляете пространство имен, и оно добавляет определения пространства имен по мере необходимости.
$csv = <<<'CSV'
http://example.com,monthly,0,3
http://example.com/one,daily,0,5
http://example.com/two,weekly,0,8
CSV;
$lines = array_map('str_getcsv', explode("\n", $csv));
$xmlns = 'http://www.sitemaps.org/schemas/sitemap/0.9';
$xml = new XMLWriter;
$xml->openMemory();
$xml->setIndent(true);
$xml->startElementNS(NULL, 'urlset', $xmlns);
$xml->writeAttributeNS(
'xsi',
'schemaLocation',
'http://www.w3.org/2001/XMLSchema-instance',
'http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd'
);
foreach ($lines as $line) {
if (count($line) < 4) continue;
$xml->startElement('url');
$xml->writeElement('loc', $line[0]);
$xml->writeElement('changefreq', $line[1]);
$xml->writeElement('priority', $line[2]);
$xml->endElement();
}
$xml->endElement();
echo $xml->outputMemory();
Выход:
<urlset xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://example.com</loc>
<changefreq>monthly</changefreq>
<priority>0</priority>
</url>
<url>
<loc>http://example.com/one</loc>
<changefreq>daily</changefreq>
<priority>0</priority>
</url>
<url>
<loc>http://example.com/two</loc>
<changefreq>weekly</changefreq>
<priority>0</priority>
</url>
</urlset>
Обратите внимание xsi:schemaLocation
атрибут должен быть необязательным.