如何匹配xml中的产品ID属性,然后将产品元素放入数组中

时间:2013-06-04 21:47:21

标签: php xml foreach

我的xml结构如下,我想用php循环遍历xml并匹配product id属性。如果我得到一个匹配项,我想将产品元素添加到数组中并从函数中返回它们。

<Includes>
    <Products>
        <Product id="11348613">
             <name>Product A</name>
             <description>Product A's description</description>
             <image>http://www.domain.com/images/productA.jpg</image>
         </Product>
        <Product id="11348614">
             <name>Product B</name>
             <description>Product B's description</description>
             <image>http://www.domain.com/images/productB.jpg</image>
         </Product>
    </Products>
</Includes>

我到目前为止的代码如下所示,这不是很有效,因为我不认为我理解如何匹配属性然后返回元素。你能指出我出错的地方吗?

function lookupSkuFromProdId($ProductId) {
    $reviewsXML = simplexml_load_file('reviews.xml');
    foreach ($reviewsXML->Includes->Products->attributes() as $sku) {
        if ($sku == $ProductId) {   
            $skuData = array();
            $skuData[name] = $sku->name;
            $skuData[description] = $sku->description;
            $skuData[image] = $sku->image;    
        }
    return $skuData;
}  

3 个答案:

答案 0 :(得分:2)

这是一个code snippet来获取您正在寻找的东西,使用XPath来匹配使用它的ID的产品。

  

请记住我的代码中的一些细微变化:

     
      
  1. 您的XML无效,因为它在</Product>结束标记之前有一个额外的</Products>结束标记;
  2.   
  3. $ProductId变量重命名为$productId以获取CamelCase一致性;
  4.   
  5. 将SimpleXMLElement变量添加为lookupSkuFromProdId函数的第二个参数,但您可以像以前一样从文件中加载它。
  6.   
<?php
$xml = <<<XML
<Includes>
    <Products>
        <Product id="11348613">
            <name>Product A</name>
            <description>Product A's description</description>
            <image>http://www.domain.com/images/productA.jpg</image>
        </Product>
        <Product id="11348614">
            <name>Product B</name>
            <description>Product B's description</description>
            <image>http://www.domain.com/images/productB.jpg</image>
        </Product>
    </Products>
</Includes>
XML;

$reviewsXML = new SimpleXMLElement($xml);
$productId  = 11348613;

function lookupSkuFromProdId($productId, $reviewsXML) {
    $skuData = array();

    // Loading it from a PHP variable for this example only
    // Just uncomment this and load it as before
    // $reviewsXML = simplexml_load_file('reviews.xml');

    $sku = $reviewsXML->xpath("//Product[@id = '{$productId}']");

    if (!empty($sku)) {
        $skuData[name]        = (string) $sku[0]->name;
        $skuData[description] = (string) $sku[0]->description;
        $skuData[image]       = (string) $sku[0]->image;
    }

    return $skuData;
}

$skuData = lookupSkuFromProdId($productId, $reviewsXML);
print_r($skuData);

输出继电器:

Array
(
    [name] => Product A
    [description] => Product A's description
    [image] => http://www.domain.com/images/productA.jpg
)

答案 1 :(得分:1)

修复了一些问题,包括...缺少结束括号,循环遍历<Product>元素而不是属性,然后检查循环中的属性值并在找到匹配时断开...

function lookupSkuFromProdId($ProductId) {
    $reviewsXML = simplexml_load_file('reviews.xml');
    foreach ($reviewsXML->Products->Product as $sku) {
        if ($sku['id'] == $ProductId) {  
            $skuData = array();
            $skuData['name'] = (string)$sku->name;
            $skuData['description'] = (string)$sku->description;
            $skuData['image'] = (string)$sku->image;
            break;    
        }
    }
    return $skuData;
} 

codepad.viper-7.com/8ONLaK

查看类似代码的演示

答案 2 :(得分:0)

我看到你的方法有几个问题,你没有正确循环遍历xml树,你需要将XML对象转换为字符串以便将其值保存到数组中,并且你缺少括号和引号数组索引。我修改了你的代码,试试这个:

function lookupSkuFromProdId($ProductId) {
    $reviewsXML = simplexml_load_file('reviews.xml');
    $skuData = array();
    foreach($reviewsXML->Products[0]->Product as $sku) {
        if ($sku['id'] == $ProductId){
            $skuData['name'] = (string)$sku->name;
            $skuData['description'] = (string)$sku->description;
            $skuData['image'] = (string)$sku->image;    
        }
    }
    return $skuData;
}
希望它有所帮助!