У меня есть стандартная подача ATOM из экземпляра WordPress. В ленте отображаются следующие элементы категории:
<category scheme="http://alpha-s2new.simplescienceinc.com/blog" term="Blog" />
<category scheme="http://alpha-s2new.simplescienceinc.com/blog" term="Mobile" />
<category scheme="http://alpha-s2new.simplescienceinc.com/blog" term="Websites" />
Я использую следующий код для разбора канала:
foreach ($rss->getElementsByTagName('entry') as $node) {
$item = array(
'title' => $node->getElementsByTagName('title')->item(0)->nodeValue,
'desc' => $node->getElementsByTagName('content')->item(0)->nodeValue,
'link' => $node->getElementsByTagName('link')->item(0)->nodeValue,
'date' => $node->getElementsByTagName('updated')->item(0)->nodeValue,
'author' => $node->getElementsByTagName('name')->item(0)->nodeValue,
'postid' => $node->getElementsByTagName('id')->item(0)->nodeValue,
'cats' => $node->getElementsByTagName('category')->item(0)->nodeValue
);
array_push($feed, $item);
}
Как вы можете видеть … последний элемент тянет узел «категория». Но он возвращает пустую строку. И я думаю, что знаю почему. Таким образом, вопрос заключается в том, какой синтаксис используется для обозначения терминов.
term
это атрибут, поэтому вам нужно использовать getAttribute
чтобы получить данные из него. Например:
// $dom is the DOMDocument object holding the XML
$cats = $dom->getElementsByTagName('category');
foreach ($cats as $c) {
echo "term: " . $c->getAttribute('term') . PHP_EOL;
}
Выход:
term: Blog
term: Mobile
term: Websites
Если вы используете $c->nodeValue
, вы ничего не получите, потому что у узла нет значения — он пуст. Чтобы получить атрибут термина первой категории, вам нужно заменить текущую строку следующим:
'cats' => $node->getElementsByTagName('category')->item(0)->getAttribute('term')
Других решений пока нет …