目的:
创建一个方法来检索具有特定“id”的嵌套元素。
我尝试了什么:
示例XML:
<?xml version="1.0" encoding="UTF-8"?>
<table>
<row id="1">
<job>construction</job>
<age>34</age>
<name>bob</name>
</row>
<row id="2">
<job>construction</job>
<age>34</age>
<name>bob</name>
</row>
<row id="3">
<job>construction</job>
<age>34</age>
<name>bob</name>
</row>
<row id="4">
<job>construction</job>
<age>34</age>
<name>bob</name>
</row>
</table>
Php代码:
Class SimpleORM{
...
public function find($id)
{
settype($id, "int");
$xpath = new DOMXPath($this->_dom);
$expression = '/row[@id=' . $id . ']';
return $xpath->query($expression);
}
}
这里可以阅读fUll Php代码 - &gt; https://github.com/Danoon/SimpleORM/blob/master/SimpleORM.php
问题:
为什么没有返回正确的元素/节点,我该如何实现呢?
调用查找功能
$users = new SimpleORM("users");
$result = $users->find(1);
答案 0 :(得分:2)
你是在正确的轨道,但你犯了一个错误。如果您使用XPath,解决方案确实是最简单的:
'//row[@id="' . $id . '"]'
您忘记了id
属性周围的“(双引号)。
答案 1 :(得分:2)
当您使用DOMDocument时,您将获得对象。所以你需要像下面这样获取它。
$users = new SimpleORM("table.xml");
//print $users->_dom->saveXML();die;
$result = $users->find(1);
if($result->length)
{
print $result->item(0)->nodeValue;
}
注意:我从上面的代码中得到了正确的结果。
<强>建议:强>
您可以改进find($id)
您当前的函数将所有three(job, age, name)
值组合在一起。但是如果你想让它更灵活,你可以在find($id, $withChildren)
中传递一个额外的参数。以下是示例建议代码。
public function find($id, $withChildren=false)
{
$xpath = new DOMXPath($this->_dom);
if($withChildren)
{
$expression = '//table/row[@id=' . $id . ']/*';
}
else
$expression = '//table/row[@id=' . $id . ']';
return $xpath->query($expression);
}
你可以调用它,就像你可以在循环中获取所有结果子元素一样。您也可以使用nodeName
打印nodeValue
,最好看一下。
$users = new SimpleORM("table.xml");
$result = $users->find(1, true);
if($result->length)
{
foreach ($result as $n){
echo $n->nodeName." : ".$n->nodeValue."<br/>";
}
}
答案 2 :(得分:1)
试试这个
<?php
$slideids = array();
$get_id = 2;
$xml = new DOMDocument();
$xml->load('test.xml'); // path of your XML file ,make sure path is correct
$xpd = new DOMXPath($xml);
false&&$result_data = new DOMElement(); //this is for my IDE to have intellysense
$result = $xpd->query("//row[@id=".$get_id."]/*"); // change the table naem here
foreach($result as $result_data){
$key = $result_data->nodeName;
$values = $result_data->nodeValue;
$slideids[$key] = $values;
}
echo '<pre/>';
print_r($slideids);
?>