如何使用 xpath 和 php 类方法更正此代码,以便将选定的 xml 标记从一个 xml 源添加到另一个源中


How to correct this code for adding selected xml tags from one xml source into another using xpath and php class methods

我想读取以下xml并通过它们的id值查找特定的xml标签,最后我想使用php用户定义类方法将这些选定的标签复制到另一个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 和物料 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);
?>

作为一个初学者,我确信我犯了一些错误,但现在我被困在了点上。我想使用现有的给定类层次结构来执行此操作。请帮助我完成此代码。谢谢

您可以使用 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();

你的"核心"代码很好,但类构造是错误的(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();