2016-03-06 48 views
0

我想讀取以下xml並通過它們的id值查找特定的xml標記,最後我想複製這些選定的標記使用PHP用戶定義類的方法在另一個內部的xml:樣品如下:如何更正此代碼,用於將使用xpath和php類方法從一個xml源添加選定的xml標記到另一個

<items> 
     <item> 
     <id>1</id> 
     <name>Item-1</name> 
     <price>10</price> 
     </item> 

     <item> 
     <id>2</id> 
     <name>Item-2</name> 
     <price>20</price> 
     </item> 

     <item> 
     <id>3</id> 
     <name>Item-3</name> 
     <price>30</price> 
     </item>   
    </items> 

<customer> 
    <purchasedItems> 
     // add the xml here for the purchased Item chosen by id values 
    </purchasedItems> 
</customer> 

如果顧客購買了物品-1和Item-3,則輸出將是:

<customer> 
     <purchasedItems> 
      <item> 
      <id>1</id> 
      <name>Item-1</name> 
      <price>10</price> 
      </item> 
      <item> 
      <id>3</id> 
      <name>Item-3</name> 
      <price>30</price> 
      </item> 
     </purchasedItems> 
</customer> 

我嘗試用下面的代碼這不起作用:

<?php 
header('Content-Type: text/xml'); 
class Items { 

    public static function addItem($purchasedItemsXml, $Items, $parentTag, $idTag ,$id) 
    { 
     $docSource = new DOMDocument(); 
     $docSource->loadXML($Items); 
     $docDest = new DOMDocument(); 
     $docDest->loadXML($purchasedItemsXml); 
     $xpath = new DOMXPath($docSource);  
     $result = $xpath->query("//{$idTag}[text()='{$id}']/parent::*");   
     $result = $docDest->importNode($result->item(0), true);  
     $items = $docDest->getElementsByTagName($parentTag)->item(0); 
     $items->appendChild($result);    
     echo $docDest->saveXML();    
     return ; 
    } 
} 

更新:更改以下代碼後,現在它的工作得益於所有。

class purchasedItems extends Items{ 
    public static function addPurchasedItems($purchasedItemsXml, $Items, $parentTag, $idTag, $ids){ 
     $count =0; 
     foreach ($ids as $id) {   
      if($count==0){ 
       $xml = self::addItem($purchasedItemsXml, $Items, $parentTag, $idTag, $id); 
      } 
      else{ 
      $xml = self::addItem($xml, $Items, $parentTag, $idTag, $id); 
      } 
      $count++; 

     }  
     echo $xml; 

     return ; 
    } 
} 



$Items = "<items> 
       <item> 
       <id>1</id> 
       <name>Item-1</name> 
       <price>10</price> 
       </item>   
       <item> 
       <id>2</id> 
       <name>Item-2</name> 
       <price>20</price> 
       </item>   
       <item> 
       <id>3</id> 
       <name>Item-3</name> 
       <price>30</price> 
       </item>   
      </items>"; 

$purchasedItemsXml = "<customer> 
          <purchasedItems> 

          </purchasedItems> 
         </customer>"; 
$ids = array(1, 3); 
$parentTag = 'purchasedItems'; 
$idTag = 'id'; 
purchasedItems::addPurchasedItems($purchasedItemsXml, $Items, $parentTag, $idTag, $ids); 
?> 

作爲一個初學者,我相信我做了一些錯誤,但現在我停留在point.I希望這個使用現有的某一類hierarchy.please幫我這個code.Thanks

+1

$ XML =新的SimpleXMLElement($ purchasedItemsXml); –

回答

1

您可以通過使用SimpleXML實現這一目標:

$xml = new SimpleXMLElement($purchasedItemsXml); 

那麼這樣的訪問:echo $xml->purchasedItems->item[0]->name;

要訪問兒童標籤的元素做到這一點:

foreach($xml->purchasedItems->item as $item) 
{ 
    echo $item->name; //and other properties like this. 
    //if not sure try var_dump($item) here it will tell you. 
} 

常見的錯誤是引用根元素在你的代碼,不這樣做,否則將無法正常工作,你需要省略根元素,在你的情況下customer

編輯:要新增項目,找項目,如我上面顯示,並加入他們這樣的:

$item = $xml->purchasedItems->addChild('item'); 
$item->addChild('name', 'SimpleXML Rocks just like that'); 
$item->addChild('id', '3'); 


echo $xml->saveXML(); 
+0

我試試你的code.but not working.thanks – user5005768

+0

我更新,現在檢查。 –

+1

你看過問題代碼嗎? 'buyingItems'沒有'item','item'必須添加到它。 – fusion3k

1

你的「核心」的代碼是好的,但類建築是錯誤的(parent::addItem沒有按不存在,並且addPayHead爲每個添加的項目回顯一個文檔)。

此代碼 - 無類 - 將工作:

$ids = array(1, 3); 
$parentTag = 'purchasedItems'; 
$idTag = 'id'; 

$docSource = new DOMDocument(); 
$docSource->loadXML($Items); 

$docDest = new DOMDocument(); 
$docDest->loadXML($purchasedItemsXml); 

$xpath = new DOMXPath($docSource);  

foreach($ids as $id) 
{ 
    $query = "//{$idTag}[text()='{$id}']/parent::*"; 

    $result = $xpath->query($query); 
    $result = $docDest->importNode($result->item(0), true);  
    $items = $docDest->getElementsByTagName($parentTag)->item(0); 
    $items->appendChild($result);    
} 

echo $docDest->saveXML();    
+0

hi @ fusion3k。但是我怎麼能用班呢?謝謝你給我1個錯字。 – user5005768

+0

hi @ fusion3k。我是否需要爲xml字符串聲明任何類變量以保留最新的變化?謝謝 – user5005768

+1

爲自己而努力......它並不複雜!建議:在課堂上,你必須返回'$ docDest'來追加其他孩子。如果您找不到解決方案,請告知我們:在這種情況下,我會在12小時內更新答案。現在我真的要走了,我很抱歉。 – fusion3k

相關問題