-4

目的 :

创建一个方法来检索具有特定“id”的嵌套元素。

我尝试过的:

  • 通过 DOMXpath 类查询方法检索带有 x 路径表达式的代码。每次返回一个空节点列表
    • '/行[@id=' 。$id 。']'
    • '//表/行[@id=' . $id 。']'
    • '/ / [@id=' . $id 。']'
  • 尝试使用 DOMDocument::getElementById 并在实例化 DOMDocument 类后立即设置 DOMDocument::$validateOnParse 。这也返回一个空节点列表。

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

}

完整的 PHP 代码可以在这里阅读 -> https://github.com/Danoon/SimpleORM/blob/master/SimpleORM.php

问题 :

为什么没有返回正确的元素/节点,我该如何实现?

调用查找函数

$users = new SimpleORM("users");
$result = $users->find(1);
4

3 回答 3

2

你在正确的轨道上,但你犯了一个错误。如果您使用 XPath,解决方案确实是最简单的:

'//row[@id="' . $id . '"]'

id您忘记了属性周围的 "(双引号) 。

于 2013-05-20T11:18:20.990 回答
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/>";
    }
}
于 2013-05-20T11:37:24.313 回答
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);
?>

XPath 查询/表达式的参考手册排序

于 2013-05-20T11:47:32.750 回答