0

我的 xml 结构如下所示,我想用 php 遍历 xml 并匹配产品 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;
}  
4

3 回答 3

2

这是一个代码片段,用于使用 XPath 使用其 ID 匹配产品来获取您要查找的内容。

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

  1. 您的 XML 无效,因为它在</Product>结束标记之前有一个额外的</Products>结束标记;
  2. $ProductId变量重命名$productId为 CamelCase 一致性;
  3. 添加 SimpleXMLElement 变量作为lookupSkuFromProdId函数的第二个参数,但您可以像以前一样从文件中加载它。
<?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
)
于 2013-06-04T22:07:37.287 回答
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上查看类似代码的演示

于 2013-06-04T22:08:00.617 回答
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;
}

希望能帮助到你!

于 2013-06-04T22:12:33.573 回答