2009-09-02 2 views
11

, когда я хочу, чтобы проверить массив PHP Я использую следующий кодКак просмотреть данные DOMNodeList объекта в PHP

print_r($myarray); 

, но знаю, что я хочу видеть данные объекта мой объект

$xpath = new DOMXPath($doc); 
    $myobject = $xpath->query('//*[ancestor-or-self::a]'); 

, когда я использую

print_r($myobject); 

я получаю, что выход

DOMNodeList Object () 

Я хочу выполнить итерацию значений этого объекта, чтобы проверить результат моего запроса?

ответ

1

var_dump($myobject); может быть то, что вы ищете

+2

Спасибо, но когда я использую var_dump я получаю этот выход «объект (DOMNodeList) # 9 (0) {}», я уверен, что это не выход, я ищу, потому что MyObject имеет много данных. – ahmed

+1

, очевидно, это не так.Вы можете взглянуть на комментарий zombat о xpath, поскольку это территория, которую я не слишком хорошо знаком с DomXPath, но если var_dump говорит о ее пустом, то я вполне уверен, что у нее нет того, что, по вашему мнению, имеет в ней = ( – Ryan

1

Ваш XPath запрос ничего не соответствует в вашем XML.

Из DomXPath::query manual page:

Возвращает DOMNodeList, содержащий все узлы, соответствующие данное выражение XPath . Любое выражение, которое делает , не возвращает узлы, возвращает пустой DOMNodeList.

+0

Спасибо, но я уверен, что есть данные в моем объекте. Я могу распечатать некоторые данные, когда я использую следующий цикл «foreach ($ xpath-> query ('// * [ancestor-or-self :: a]') как $ myobject) {echo $ myobject-> tagName;} " – ahmed

1

Как насчет рекурсивной функции?

Function XMLPrint_r($d_DomNode) { 
    print $d_DomNode->$nodeName." ".$d_DomNode->$nodeValue."<br>"; 
    Foreach($d_DomNode->$childNodes as $d_ChildNode) { 
     print " "; 
     XMLPrint_r($d_ChildNode); 
    } 
} 

Я не проверял это, но вы поняли эту идею.

20

DOMNodeList - интересный объект, из которого вы не получите много информации, используя print_r или var_dump.

Существует много способов просмотра данных объекта DOMNodeList. Вот пример:

$xpath = new DOMXpath($dom); 
$dom_node_list = $xpath->query($your_xpath_query); 
$temp_dom = new DOMDocument(); 
foreach($dom_node_list as $n) $temp_dom->appendChild($temp_dom->importNode($n,true)); 
print_r($temp_dom->saveHTML()); 

(Конечно, использовать saveXML вместо saveHTML, если вы имеете дело с XML.)

DOMNodeList может повторяться в течение как массив. Если вы хотите вытащить данные из объекта DOMNodeList и поместить его в другую структуру данных, такую ​​как массив или объект stdClass, тогда вы просто перебираете «узлы» в DOMNodeList, преобразуя значения узлов и/или атрибуты (которые вы хотите иметь), прежде чем добавлять их в новую структуру данных.

+1

Спасибо. Тот факт, что print_r терпит неудачу в dom-объекте, сосет во многих отношениях. – Juergen

1

По какой-то причине, я не смог получить методы saveHTML/saveXML работать. Поэтому я написал свою собственную рекурсивную процедуру, которая работает для меня:

function pvIndent ($ind) { 
    for ($i=0;$i<$ind;$i++) 
     print (" "); 
} 

function pvPrint_r ($val) { 
    echo '<pre>'; 
    print_r ($val); 
    echo '</pre>'; 
} 

function pvDOMNodeListPrint_r_ ($ind,$DOMNodeList) { 
    for ($item=0;$item<$DOMNodeList->length;$item++) { 
     $DOMNode = $DOMNodeList->item($item); 
     if ($DOMNode->nodeName != "#text") { 
      pvIndent ($ind); 
      print $DOMNode->nodeName; 
      if ($DOMNode->nodeValue) 
       print " = " . trim($DOMNode->nodeValue); 
      print "\n"; 
      if ($DOMNode->attributes) 
       for ($attr=0;$attr<$DOMNode->attributes->length;$attr++) { 
        $DOMNodeAttr = $DOMNode->attributes->item($attr); 
        pvIndent ($ind+1); 
        print "@" . $DOMNodeAttr->nodeName . " = " . trim($DOMNodeAttr->nodeValue) . "\n"; 
       } 
      if ($DOMNode->childNodes) 
       pvDOMNodeListPrint_r_ ($ind+1,$DOMNode->childNodes); 
     } 
    } 
} 

function pvDOMNodeListPrint_r ($DOMNodeList) { 
    echo '<pre>'; 
    pvDOMNodeListPrint_r_ (0,$DOMNodeList); 
    echo '</pre>'; 
} 

вызова pvDOMNodeListPrint_r с результатом из запроса на объекте XDOMPath.

Примечание:

ФВ только префикс я использую, чтобы избежать загрязнения пространства имен - не стесняйтесь редактировать его.

Предварительные теги используются таким образом, чтобы свободное пространство и символы новой строки правильно обрабатывались для форматирования при выводе в тело вашего html, где мне обычно нужны такие отладочные операторы - вы можете отформатировать на свой вкус.

Я явно пропустил DOMNode с именем «#text», поскольку они, похоже, повторяют текст, уже содержащийся в родительском узле. Я не уверен, что это правильно для всех допустимых XDOMPath, загруженных HTML, но я еще не видел исключения - вы всегда можете исключить исключение, если не возражаете против обычной избыточности.

-1

После большой отладки я обнаружил, что все объекты DOM невидимы для var_dump() и print_r(), я предполагаю, что они являются объектами C, а не объектами PHP. Поэтому я попробовал saveXML(), который отлично работает с DOMDocument, но не реализован в DOMElement.

Решения простое (если вы его знаете):

$xml = $domElement->ownerDocument->saveXML($domElement); 
3

Можно перемещаться по узлам с помощью простого Еогеаспа следующего образом:

foreach ($myobject as $node) { 

    echo $node->nodeValue, PHP_EOL; 

} // end foreach 

Надеется, что это может помочь другим , важные фрагменты кода являются

foreach 

и деталь

$node->nodeValue 

для получения более подробной информации относительно этого класса, пожалуйста, посетите:

http://php.net/manual/en/class.domnodelist.php

1

Немного поздно в игре, но, возможно, это поможет кому-то ...

Будьте в курсе UTF-8 вывод при использовании самого объекта dom/xpath.

Если бы выводить nodeValue напрямую, вы бы повреждаться символы, например:

ìÂÂì ë¹Â디ì¤ 
ìì ë¹ë””ì¤ í°ì íì¤ 

Вы должны загрузить объект DOM со вторыми парами «UTF-8», new \DomDocument('1.0', 'utf-8'), но все же при печати список узлов дома/значение элемента вы получите неработающие символы:

echo $contentItem->item($index)->nodeValue

вы должны обернуть его с utf8_decode:

echo utf8_decode($contentItem->item($index)->nodeValue) //output: 者不終朝而會,愚者可浹旬而學

Смежные вопросы