2013-05-20 67 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/>"; 
    } 
}