Не доверяйте выводу оператора print_r ... кажется, что он показывает пустой объект, но в моем тестировании дети на самом деле все еще там.Например, начиная с кода выше:
$sxml = simplexml_load_file('test.html');
$sxml_zuq = $sxml->xpath('//zuq:*/descendant-or-self::node()');
Если я впоследствии попробую команду, подобную этой:
print_r($sxml_zuq[0]->div->h1);
, я получу такой вывод:
SimpleXMLElement Object
(
)
Вроде бы пусто, верно?Но если я изменю команду так, чтобы она выглядела так:
echo $sxml_zuq[0]->div->h1->asXML();
Я получу результирующее дерево с дочерним пространством имен:
<h1><zuq:data name="myDataHeading"/></h1>
Я не уверен на 100%, почему это так;Вероятно, это как-то связано с оператором print_r, который пытается сгладить объект simplexml и неправильно обрабатывает пространства имен.Но когда вы сохраняете сами объекты simplexml, которые возвращаются из вашего вызова xpath, все дочерние объекты сохраняются.
Теперь, что касается самого вашего xpath, вы, вероятно, НЕ ХОТИТЕ ось «потомок или сам», потому что она будет соответствовать не только элементу верхнего уровня zuq, но и всем его дочерним элементам.и создайте массив большего размера, чем вы на самом деле пытаетесь вернуть (если я не понимаю, о чем вы спрашиваете).Если вы попробуете что-то вроде этого:
$sxml_zuq = $sxml->xpath('//zuq:*[not(ancestor::zuq:*)]');
, вы получите массив ТОЛЬКО верхнего уровня элементов пространства имен zuq.(хотя ваш пример XML имел только один такой элемент верхнего уровня, ваши фактические данные могут иметь несколько братьев и сестер на этом уровне).Затем вы можете захватить содержимое каждого из этих элементов верхнего уровня следующим образом:
foreach ($sxml_zuq as $zuq_node) {
echo ($zuq_node->asXML());
}
Все становится немного сложнее, если вы хотите повторить этот процесс, но выполните поиск элементов верхнего уровня (или любых других)в пространстве имен по умолчанию;вам нужно будет использовать функцию registerNamespace, чтобы присвоить пространству имен по умолчанию временный префикс, и выполнить поиск xpath по нему.