DOMDocument::getElementsByTagName()
возвращает все узлы дочерних элементов с указанным именем. DOMElement::$nodeValue
вернет текстовое содержимое узла элемента, включая всех его потомков.
В вашем случае echo $entry->getElementsByTagName("tags")->item(0)->nodeValue
выбирает все tags
, получает доступ к первому узлу этого списка и выводит его текстовое содержимое. Это greatfunomg
.
Использование методов DOM для доступа к узлам является многословным и требует много кода и, если вы хотите сделать это правильно, много условий. Это намного проще, если вы используете выражения Xpath. Позволяет скалярные значения и списки узлов из DOM.
$xml = <<<'XML'
<_>
<resource>
<title>hello world</title>
<tags>
<resource>great</resource>
<resource>fun</resource>
<resource>omg</resource>
</tags>
</resource>
</_>
XML;
$document = new DOMDocument();
$document->loadXML($xml);
// create an Xpath instance for the document
$xpath = new DOMXpath($document);
// fetch resource nodes that are a direct children of the document element
$entries = $xpath->evaluate('/*/resource');
foreach($entries as $entry) {
// fetch the title node of the current entry as a string
echo $xpath->evaluate('string(title)', $entry), "\n";
// fetch resource nodes that are children of the tags node
// and map them into an array of strings
$tags = array_map(
function(\DOMElement $node) {
return $node->textContent;
},
iterator_to_array($xpath->evaluate('tags/resource', $entry))
);
echo implode(', ', $tags), "\n";
}
Выход:
hello world
great, fun, omg