如何在 php 中查看 DOMNodeList 对象的数据

问题描述 投票:0回答:10

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

    print_r($myarray);

但是知道我想看一个对象的数据 我的对象是

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

我用的时候

    print_r($myobject);

我得到那个输出

    DOMNodeList Object ( )

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

php dom xpath domdocument
10个回答
25
投票

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());

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

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


6
投票

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

foreach ($myobject as $node) {

  echo $node->nodeValue, PHP_EOL;

} // end foreach 

希望能帮到别人,重要的代码是

foreach 

和项目

$node->nodeValue

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

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


2
投票

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


1
投票

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

来自DomXPath::query 手册页:

返回一个 DOMNodeList 包含所有 匹配给定 XPath 的节点 表达 。任何做的表达 不返回节点将返回一个空 DOMNodeList.


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);
    }
}

我没有测试这个,但你明白了。


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 是否正确,但我还没有看到异常 - 如果您不介意通常的冗余,您总是可以消除排除。


1
投票

比赛有点晚,但也许它可以帮助某人......

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

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

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

您必须使用第二个参数“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: 者不終朝而會,愚者可浹旬而學


0
投票

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


0
投票

它是一个由 xpath 加载的 xml 文件的示例

我的 xml 文件名为“test.xml”

<college>
    <student>
        <firstName>Azhar Uddin</firstName>
        <lastName>Raihan</lastName>
        <mobile>018*******</mobile>
        <fatherName>alam uddin</fatherName>
        <address>
            <presentAddress title="notun" type="multiple">
                <zila>Feni</zila>
                <upzila>chhagalniya</upzila>
                <post>3912</post>
            </presentAddress>
            <permanentAddress>
                <zila>comilla</zila>
                <upzila>sadar</upzila>
            </permanentAddress>
        </address>
    </student>
</college>

现在加载它

$sxe=simplexml_load_file('test.xml');
$address = $sxe->xpath("student/address/presentAddress");

foreach($address as $addr)
{
    foreach($addr as $key=>$val)
    {
        echo $key."=".$val,"<br>";
    }
}

-2
投票

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

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

$xml = $domElement->ownerDocument->saveXML($domElement);
© www.soinside.com 2019 - 2024. All rights reserved.