当我想测试 php 数组时,我使用以下代码
print_r($myarray);
但是知道我想看一个对象的数据 我的对象是
$xpath = new DOMXPath($doc);
$myobject = $xpath->query('//*[ancestor-or-self::a]');
我用的时候
print_r($myobject);
我得到那个输出
DOMNodeList Object ( )
我想遍历这个对象的值来测试我的查询结果?
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 中的“节点”,转换节点的值和/或在将属性(您希望可用的)添加到新数据结构之前。
可以使用一个简单的 foreach 来浏览节点,如下所示:
foreach ($myobject as $node) {
echo $node->nodeValue, PHP_EOL;
} // end foreach
希望能帮到别人,重要的代码是
foreach
和项目
$node->nodeValue
有关此课程的更多详细信息,请访问:
有人写了一个很棒的 getArray() 函数: http://www.php.net/manual/en/class.domdocument.php#101014
您的 xpath 查询与您的 XML 中的任何内容都不匹配。
返回一个 DOMNodeList 包含所有 匹配给定 XPath 的节点 表达 。任何做的表达 不返回节点将返回一个空 DOMNodeList.
递归函数怎么样?
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);
}
}
我没有测试这个,但你明白了。
出于某种原因,我无法让 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 是否正确,但我还没有看到异常 - 如果您不介意通常的冗余,您总是可以消除排除。
比赛有点晚,但也许它可以帮助某人......
在使用 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: 者不終朝而會,愚者可浹旬而學
var_dump($myobject);
可能就是你要找的
它是一个由 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>";
}
}
经过多次调试,我发现所有 DOM 对象对 var_dump() 和 print_r() 都是不可见的,我猜是因为它们是 C 对象而不是 PHP 对象。所以我尝试了 saveXML(),它在 DOMDocument 上运行良好,但没有在 DOMElement 上实现。
解决方案很简单(如果你知道的话):
$xml = $domElement->ownerDocument->saveXML($domElement);