2016-06-22 61 views
0

我有下面的示例XML文檔:如何使用SimpleXML在PHP中的單個元素上執行XPath?

<?xml version="1.0" encoding="UTF-8" ?> 
<database> 
    <record> 
     <id>1</id> 
     <a>5</a> 
    </record> 
    <record> 
     <id>5</id> 
     <a>8</a> 
    </record> 
    <record> 
     <id>7</id> 
     <!--No a record!--> 
    </record> 
    <record> 
     <id>6</id> 
     <a>10</a> 
    </record> 
</database> 

我想通過每一個「記錄」元素進行迭代,並獲取其相應如果存在「a」元素。

我嘗試這個使用下面的代碼:

$xml = new SimpleXMLElement($xmlStringDataFromFile); 
    foreach ($xml->record as $record) { 
     $id = $record->xpath("//id")[0]; 
     $a = $record->xpath("//a")[0]; 
     echo "{$id}: {$a}\n"; 
    } 

但是執行的XPath是對整個文檔。而不是個人「記錄」元素。因此,我得到了以下的輸出:

1: 5 
1: 5 
1: 5 
1: 5 

我想下面的輸出:

1: 5 
5: 8 
7: 
6: 10 

我該怎麼辦呢?

回答

1

當您在XPath表達式的開始處使用//時,它將從文檔根目錄搜索並始終以相同結果結束。由於ida元件直接record下簡單地使用

$id = $record->xpath("id")[0]; 
    $a = $record->xpath("a")[0]; 

如果他們將處於相同的水平低於record.啓動XPath表達式來搜索相對於上下文節點:

$id = $record->xpath(".//id")[0]; 
    $a = $record->xpath(".//a")[0];