Не следует использовать SimpleXMLElement::getNamespaces()
для извлечения URI пространства имен из документа.Это определяющие значения, а не префиксы.Префиксы / псевдонимы являются необязательными для узлов элементов XML и могут изменяться в любом узле элемента.Так что просто определите массив для всех используемых вами пространств имен.
SimpleXMLElement::children()
действует как фильтр и возвращает SimpleXMLElement
.Вы можете использовать синтаксис свойства для доступа к отфильтрованным дочерним элементам.
$languages = simplexml_load_string($xml);
$ns = [
'dc' => 'http://purl.org/dc/elements/1.1/'
];
$parent = $languages->children($ns["dc"])->lang;
foreach($parent as $lang) {
$creator = $lang->children($ns["dc"])->creator;
echo htmlspecialchars($creator).'<br>';
}
Вывод:
Dennis Ritchie<br>Rasmus Lerdorf<br>James Gosling<br>
В DOM вы можете использовать Xpath (после регистрации пространств имен) для получения значений:
$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMXpath($document);
$xpath->registerNamespace('d', 'http://purl.org/dc/elements/1.1/');
foreach($xpath->evaluate('/d:languages/d:lang') as $lang) {
$creator = $xpath->evaluate('string(d:creator)', $lang);
echo htmlspecialchars($creator), '<br>';
}