2012-08-30 60 views
0

這裏是XML:使用類函數參數作爲xpath的路徑似乎不起作用?

<Routes> 
    <Route type="source"> 
     <Name>incoming</Name> 
    <Table><Tablename>incoming</Tablename></Table> 
    </Route> 
    <Route type="dest"> 
     <Name>outgoing</Name> 
    </Route> 
</Routes> 

我的目標是儘量輸出「進入」從路線/表/表名,而是使用一類具有的功能。

$doc = new SimpleXMLElement('routingConfig.xml', null, true); 

class traverseXML 
    { 
    function getData($path = "Route", $type, $operation){ 
     global $doc; 


     if($type == "table"){ 
      $path = $path."[1]/Table/Tablename"; 
      } 

     if($operation == "value"){ 
      return $doc->xpath($path); 
      } 

     } 

     } 
$traverseXML = new traverseXML; 

我還以爲這將返回一個值,但它返回一個數組:如果我這樣做,而不是

echo $traverseXML->getData("Route", "table", "value"); 
//returns: Array 

print_r($traverseXML->getData("Route", "table", "value")); 
//returns: Array () 

爲什麼會返回一個數組,而不是一個值?

謝謝先進。

+0

'[0]'應該是'[1]'(位置被基於1的,而不是從0開始)。另外,你的XML被破壞了,因爲它應該以''結尾。 – salathe

+0

感謝您指出 - 它實際上仍然做同樣的事情。 – Jared

+0

它不會爲我返回一個空數組。 http://viperpad.com/aNgLj7 – salathe

回答

1

SimpleXMLElement::xpath()返回一個數組,其中包含找到的項(即使只有一個)。如果您不需要數組,請更改函數以查看從XPath查詢返回的結果,並返回所需的任何結果。

例如,

if ($operation == "value") { 
     $results = $doc->xpath($path); 

     if (empty($results)) { 
      return NULL; 
     } 

     return (string) $results[0]; 
    } 
+0

剛開始弄明白,太感謝你了。 – Jared

0

因爲該XPath返回的節點集 - 即與表達式匹配的所有節點的列表。在這種特殊情況下,只有一個匹配的節點,但由於在原則上的XPath返回一個列表我認爲這是在PHP中的數組映射。

嘗試使用XPath像

string(Route[1]/Table/Tablename) 
使用XPath標準功能 string()轉換的節點設置成一個字符串

- 這應該給你一個值。

+0

你能否詳細說明一下? 'string()'不是函數嗎?我試圖按照這裏顯示的輪廓:http://www.phpfreaks.com/tutorial/handling-xml-data,他們只是使用echo'$父 - > child'來獲取值。 – Jared

+0

我擴大了答案了一點,但我沒有太多的補充。我沒有使用PHP的具體經驗,但是我肯定會期望一個數組或其他形式的枚舉作爲該XPath的結果。 – MiMo

+0

...閱讀您鏈接的頁面:'您當然可以使用任何有效的XPath查詢。該方法將始終返回一個數組'。他們確實使用'$ echo ...',但在陣列的foreach循環中。 '$ parent-> child'示例沒有使用XPath,而是直接導航DOM – MiMo