12

当我想测试 php 数组时,我使用以下代码

    print_r($myarray);

但知道我想查看我的对象所在的对象的数据

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

当我使用

    print_r($myobject);

我得到那个输出

    DOMNodeList Object ( )

我想遍历这个对象的值来测试我的查询结果?

4

9 回答 9

24

print_rDOMNodeList 是一个有趣的对象,使用or不会获得太多信息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());

(当然,如果您正在处理 XML,请使用 saveXML 而不是 saveHTML。)

DOMNodeList 可以像数组一样被迭代。如果您想从 DOMNodeList 对象中提取数据并将其放入不同的数据结构中,例如数组或 stdClass 对象,那么您只需遍历 DOMNodeList 中的“节点”,转换节点的值和/或在将它们添加到新数据结构之前。

于 2012-07-23T17:38:06.913 回答
6

可以通过使用简单的 foreach 来浏览节点,如下所示:

foreach ($myobject as $node) {

  echo $node->nodeValue, PHP_EOL;

} // end foreach 

希望它可以帮助别人,重要的代码是

foreach 

和项目

$node->nodeValue

有关此课程的更多详细信息,请访问:

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

于 2015-08-23T19:39:08.877 回答
2

有人写了一个很棒的 getArray() 函数: http ://www.php.net/manual/en/class.domdocument.php#101014

于 2013-05-07T20:03:16.353 回答
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);
    }
}

我没有对此进行测试,但你明白了。

于 2009-09-02T04:18:53.023 回答
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>';
}

使用对 XDOMPath 对象的查询结果调用 pvDOMNodeListPrint_r。

备注:

pv 只是我用来避免命名空间污染的前缀——随意编辑它。

使用了 pre 标记,因此在 html 正文中输出时可以正确处理空格和换行符以进行格式化,这是我通常需要此类调试语句的地方 - 您可以根据自己的喜好进行格式化。

我已经明确跳过了名为“#text”的 DOMNode,因为它们似乎重复了父节点中已经包含的文本。我不确定这对于所有加载了 HTML 的有效 XDOMPath 是否正确,但我还没有看到异常 - 如果您不介意通常的冗余,您可以随时消除排除。

于 2014-10-16T06:37:58.830 回答
1

游戏有点晚了,但也许它可以帮助某人......

使用 dom/xpath 对象本身时,请注意 utf-8 输出。

如果你直接输出 nodeValue,你会得到损坏的字符,例如:

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

您必须使用第二个参数 "utf-8", 加载您的 dom 对象new \DomDocument('1.0', 'utf-8'),但是当您打印 dom 节点列表/元素值时,您仍然会得到损坏的字符:

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

你必须用 utf8_decode 把它包起来:

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

于 2016-09-12T14:18:32.437 回答
0

var_dump($myobject);可能是你要找的

于 2009-09-02T03:57:05.580 回答
0

您的 xpath 查询与 XML 中的任何内容都不匹配。

DomXPath::query 手册页

返回一个 DOMNodeList ,其中包含与给定 XPath 表达式匹配的所有节点。任何不返回节点的表达式都将返回一个空的 DOMNodeList。

于 2009-09-02T04:03:21.497 回答
-2

经过多次调试,我发现所有 DOM 对象对 var_dump() 和 print_r() 都是不可见的,我的猜测是因为它们是 C 对象而不是 PHP 对象。所以我尝试了 saveXML(),它在 DOMDocument 上运行良好,但在 DOMElement 上没有实现。

解决方案很简单(如果你知道的话):

$xml = $domElement->ownerDocument->saveXML($domElement);
于 2015-02-28T10:11:16.870 回答