Чтение Google Sitemap XML через PHP - PullRequest
       23

Чтение Google Sitemap XML через PHP

0 голосов
/ 09 декабря 2011

У меня есть веб-сайт с имиджем, размещенный компанией. Они генерируют (и отправляют в Google) карту сайта для моего сайта. Я пытаюсь прочитать XML, чтобы я мог «делать что-то» с данными в моей карте сайта (а именно выискивать пропущенные подписи и пропущенные заголовки И , случайно размещая одну из этих записей на моем сайте как «изображение день"). Формат карты сайта выглядит следующим образом:

 <url>
      <loc>http://www/link</loc> 
     <image:image>
          <image:loc>http://www/img.jpg</image:loc> 
          <image:caption>caption for the image here</image:caption> 
          <image:title>title of image here</image:title> 
      </image:image>
  </url>

Моя проблема в том, что я изо всех сил пытался разобрать эти данные, чтобы сделать их пригодными для использования в PHP. Я пробовал simplexml_load_file, но кажется, что он захватывает только и игнорирует весь . Я попытался -> xpath (), но это имеет тот же результат. Как мне получить это в пригодном для использования формате?

Сноска. Чтобы получить доступ к моей карте сайта, необходимо сжать xml-файл, поэтому для его чтения я использую следующий формат:

$url = "compress.zlib://http://www/sitemap/0.xml.gz";

Я не знаю, влияет ли это на вход.

Ответы [ 4 ]

2 голосов
/ 09 декабря 2011

Для полноты я заменил print_r () следующим:

foreach (simplexml_load_string($xml) as $entry) {
    $loc = $entry->loc;
    $caption = $entry->image->caption;
    $title = $entry->image->title;

    // do stuff here
}
2 голосов
/ 25 марта 2013

Это должен быть правильный (но не очень) способ получения узлов, принадлежащих другим пространствам имен (извините за мой плохой английский).

Давайте возьмем следующую карту сайта xml:

<?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>http://www.example.com/</loc>
        <image:image>
            <image:loc>http://www.example.com/img.jpg</image:loc> 
            <image:caption>image caption</image:caption> 
            <image:title>image title</image:title> 
         </image:image>
    </url>
    <url>
        <loc>http://www.example.com/about.php</loc>
    </url>
</urlset>

Вы загружаете XML из некоторого URL:

$sitemap = simplexml_load_file($sitemap_url);

Если вы делаете:

$ns = $sitemap->getNamespaces(true);
print_r($ns);

Вы получите следующий массив:

Array
(
    [] => http://www.sitemaps.org/schemas/sitemap/0.9
    [image] => http://www.google.com/schemas/sitemap-image/1.1
)

Давайте возьмем первый URL-узел (наверняка вы сделаете foreach в своем коде)

$url = $sitemap->url[0];

Для чтения узлов 'image' необходимо использовать метод 'children', передав в качестве аргумента правое пространство имен, поэтому:

$child = $url->children($ns['image']);

или еще страшнее

$child = $url->children('http://www.google.com/schemas/sitemap-image/1.1');

Делая

print_r($child);

вы получите:

SimpleXMLElement Object
(
    [image] => SimpleXMLElement Object
        (
            [loc] => http://www.example.com/img.jpg
            [caption] => image caption
            [title] => image title
        )

)

Итак, вы можете использовать, например:

$caption = $child->image->caption;

Надеюсь, это поможет. Подробнее в этой статье http://blog.stuartherbert.com/php/2007/01/07/using-simplexml-to-parse-rss-feeds/

1 голос
/ 06 октября 2016

Разобрать как массив!

Как http://www.sitemaps.org/protocol.html XML-описание, это простое дерево с хорошим представлением массива.

Вы можете использовать 3-строчный XML-ридер ,

$sitemap_array = json_decode(
   json_encode( simplexml_load_string($sitemap_xml) ),
   TRUE
);

Так что используйте например. foreach($sitemap_array['image:image'] as $r) чтобы пройти его (проверьте var_dump($sitemap_array)) ... см. Также oop5.iterations .

PS: вы также можете сделать предыдущий выбор узла с помощью XPath по адресу simplexml.

1 голос
/ 09 декабря 2011

Как плохое решение:

$url = "compress.zlib://http://www/sitemap/0.xml.gz";
$xml=file_get_contents($url);

$xml=preg_replace('/image:(.*?)>/i','$1>',$xml);

print_r(simplexml_load_string($x));
...