我的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;
}
答案 0 :(得分:2)
这是一个code snippet来获取您正在寻找的东西,使用XPath来匹配使用它的ID的产品。
请记住我的代码中的一些细微变化:
- 您的XML无效,因为它在
</Product>
结束标记之前有一个额外的</Products>
结束标记;- 将
$ProductId
变量重命名为$productId
以获取CamelCase一致性;- 将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
)
答案 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;
}
查看类似代码的演示
答案 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;
}
希望它有所帮助!