2013-05-20 55 views
-4

目的:XML DOM文档PHP - 获得其中属性值节点

创建检索与特定的“ID”嵌套元素的方法。

我曾尝试:

  • 检索通过DOMXpath类的查询方法X路径表达式的代码。每次返回空节点列表时
    • '/ row [@ 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); 
+0

你可以告诉你如何调用该函数找到? – NullPointer

+0

我在代码块的底部添加了它。 – Dany

+0

里面有'return'的'__construct'显示了一个错误的概念。你为什么要在这里发布很多代码?请*创建一个代码示例,显示您的编程问题,并尽可能小*,同时仍然显示您的问题。 – hakre

回答

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

+0

我最终使用了这种解决方案的改编。所以这就是为什么我把这个答案作为最好的答案。 – Dany

+0

@Dany Henriquez:如果您的答案不同于此,请在下面添加它作为答案。只有这样,它清楚地显示了你最初问到的问题,从而补充了这个问题。 – hakre

2

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

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

你忘了“(双引号)围绕id属性

+0

但是,当我用你的xpath表达式替换它时,我仍然得到一个空的节点列表。 当我返回$ xpath->查询($表达式) - >项(0) - > nodeValue我得到的值。 所以我的理解我认为的方法是有问题的。 – Dany

+1

silkfire建议执行XPath查询的正确方法。这应该适用于你的情况。 – NullPointer

+0

它似乎返回一个空的节点列表,但是当id返回$ xpath-> query($ expression) - > item(0) - > nodeValue时,它确实包含连接为字符串的正确值。这告诉我,我不明白这些方法是如何工作的。 – Dany

2

当你使用DOM文档,你会得到对象因此,你需要

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

而且你可以调用它,就像你可以在循环中获取所有结果子元素一样。由此你也可以打印nodeNamenodeValue这是更好看。

$users = new SimpleORM("table.xml"); 
$result = $users->find(1, true); 

if($result->length) 
{ 
    foreach ($result as $n){ 
     echo $n->nodeName." : ".$n->nodeValue."<br/>"; 
    } 
}