Я пытаюсь обработать RSS-канал используя PHP и есть некоторые теги, такие как 'itunes:image'
который мне нужно обработать. Код, который я использую, приведен ниже, и по некоторым причинам эти элементы не возвращают никакого значения. На выходе длина равна 0.
Как я могу прочитать эти теги и получить их атрибуты?
$f = $_REQUEST['feed'];
$feed = new DOMDocument();
$feed->load($f);
$items = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('item');
foreach($items as $key => $item)
{
$title = $item->getElementsByTagName('title')->item(0)->firstChild->nodeValue;
$pubDate = $item->getElementsByTagName('pubDate')->item(0)->firstChild->nodeValue;
$description = $item->getElementsByTagName('description')->item(0)->textContent; // textContent
$arrt = $item->getElementsByTagName('itunes:image');
print_r($arrt);
}
getElementsByTagName
определяется DOM, а PHP просто следует за этим. Он не учитывает пространства имен. Вместо этого используйте getElementsByTagNameNS
, который требует полного URI пространства имен (не префикс). это по-видимому http://www.itunes.com/dtds/podcast-1.0.dtd
*. Так:
$img = $item->getElementsByTagNameNS('http://www.itunes.com/dtds/podcast-1.0.dtd', 'image');
// Set preemptive fallback, then set value if check passes
urlImage = '';
if ($img) {
$urlImage = $img->getAttribute('href');
}
Или поместите пространство имен в константу.
Возможно, вам удастся просто удалить префикс и получить все image
теги любого пространства имен с getElementsByTagName
,
Удостоверьтесь, чтобы проверить, есть ли у данного элемента itunes:image
элемент вообще (пример приведен сейчас); в примере подкаста некоторые этого не делают, и я подозреваю, что это также доставляет вам неприятности. (Если нет href
атрибутов, getAttribute
вернется либо null
или пустая строка в спецификации DOM без ошибок.)
*Если вам интересно, в этом месте нет реального DTD-файла, и не было уже около десяти лет.
Других решений пока нет …