XML DOMDocument PHP - 获取属性值的节点

时间:2013-05-20 11:12:54

标签: php xml xpath

目的:

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

我尝试了什么:

  • 通过DOMXpath类查询方法使用x路径表达式检索代码。每次返回空节点列表
    • '/ row [@ id ='。 $ id。 ']'
    • '// table / row [@ 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);
    }

}

这里可以阅读fUll Php代码 - &gt; https://github.com/Danoon/SimpleORM/blob/master/SimpleORM.php

问题:

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

调用查找功能

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

3 个答案:

答案 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);
?>

排序reference Manual for XPath Queries/expressions