2015-12-31 59 views
1

新手在這裏。PHP中xpath()函數的問題。在PHP中訪問具有動態更新謂詞屬性的XML元素

XML文件(data.xml中):

<?xml version="1.0" ?> 
<menu> 
<food type="Pizza"> 

    <item> 
      <name> Tomato &amp; Cheese </name> 
      <small price="5.50"/> 
      <large price="9.75"/> 

    </item> 

    <item> 
      <name> Onions </name> 
      <small price="6.85"/> 
      <large price="10.85"/> 

    </item> 
</food> 
</menu> 

PHP代碼:

<?php 
    $xml = simplexml_load_file("data.xml"); 
    $types = $xml->xpath("/menu/food/@type"); 
    foreach($types as $type){ 
     echo("<h1>$type</h1>"); 
     $menu = $xml->xpath("/menu/food[@type=$type]");  
     echo("<ul>"); 
     foreach($menu as $submenu){ 
     echo ("<li>$submenu</li>"); 
     } 
     echo("</ul>"); 
    } 
    ?> 

我有很多種類的食物。我想按順序訪問它們及其子類型。上述方法有問題。我似乎無法找到它。 以下是我的預期輸出。我如何用xpath()來達到這個目的?

預期輸出:

PIZZA

=>番茄&奶酪

=>洋蔥

=>

FOO

=> BAR

回答

3

你只需要一個單一的XPath查詢,像這樣:

$xml = simplexml_load_file("data.xml"); 

// Get food items and iterate over them 
$foods = $xml->xpath("/menu/food"); 
foreach($foods as $food){ 

    // print type attribute 
    echo("<h1>{$food["type"]}</h1>"); 

    // Iterate over food items and print their names 
    echo("<ul>"); 
    foreach($food->item as $item){ 
     echo ("<li>$item->name</li>"); 
    } 
    echo("</ul>"); 
} 

有了這個XML:

<?xml version="1.0" ?> 
<menu> 
<food type="Pizza"> 
    <item> 
      <name>Tomato &amp; Cheese</name> 
      <small price="5.50"/> 
      <large price="9.75"/> 
    </item> 
    <item> 
      <name>Onions</name> 
      <small price="6.85"/> 
      <large price="10.85"/> 
    </item> 
</food> 
<food type="Pasta"> 
    <item> 
      <name>Bolognese</name> 
      <small price="5.50"/> 
      <large price="9.75"/> 
    </item> 
    <item> 
      <name>Carbonara</name> 
      <small price="6.85"/> 
      <large price="10.85"/> 
    </item> 
</food> 
</menu> 

...上面的代碼將產生:

<h1>Pizza</h1> 
<ul> 
    <li>Tomato & Cheese</li> 
    <li>Onions</li> 
</ul> 

<h1>Pasta</h1> 
<ul> 
    <li>Bolognese</li> 
    <li>Carbonara</li> 
</ul> 
+0

哇,看起來不錯。是的,我想要這個抽象的佈局。我可以在哪裏詳細瞭解有關xapth()的更多信息。我搜索了,但沒有找到好的,因爲我不知道技術術語。謝謝。 – Charan

+1

網絡。玩耍,並有一定的耐心。 :) – hek2mgl

+0

再次,很好的答案。失去耐心並在此發佈。在下次再問這裏之前,我們會再次搜索更多的耐心。謝謝。 – Charan

2

嘗試改變

$menu = $xml->xpath("/menu/food[@type=$type]");  
    echo("<ul>"); 
    foreach($menu as $submenu){ 
    echo ("<li>$submenu</li>"); 
    } 

$menu = $xml->xpath("/menu/food[@type='$type']/item/name");  
    echo("<ul>"); 
    foreach($menu as $submenu){ 
    echo ("<li>$submenu</li>"); 
    } 
+0

大!這工作。我錯過了單引號。謝謝。 – Charan

+0

我覺得像單引號和雙引號在PHP中有不同的含義。我說得對嗎,馬丁? – Charan

+1

在這種情況下,它相當於一個XPath語法和語義問題,而不是PHP。如果你有一個路徑'/ menu/foo [@type = PIZZA]'(你最初的嘗試會構造這個路徑),那麼'PIZZA'將選擇這個名字的XML元素,並將它與'type'屬性進行比較。然而,你想比較'type'屬性和字符串值'PIZZA'(在你的PHP變量中),所以你需要單引號。 –