2017-09-25 174 views
0

我有一个使用simplexml_load_file方法生成的数组,但不幸的是有重复,我必须删除。为此,我使用xpath,并根据code_on_card属性删除foreach中的重复值。不幸的是,在应用xpath之后,我得到一个空数组。错误是在路径中,或者可能是在进一步的代码中?解析xpath空数组

<offer file_format="IOF" version="2.6" extensions="yes"> 
    <products> 
     <product id="8" producer_code_standard="GTIN13" code_on_card="KR001 B"> 
     </product> 
    </products> 
</offer> 

和PHP代码与不工作尝试

$XML = simplexml_load_file('file.xml'); 
$productlist = $XML->xpath("/offer/products/product/@code_on_card"); 

foreach ($productlist as $duplicate) { 
    unset($duplicate[0]); 
} 

print_r($productlist); 
+0

这将是更容易帮助,如果你附加的原始XML而不是加载对象的转储。 –

+0

我已经显示了原始XML的片段,当然被截断为相关信息 – sauero

回答

0

的代码你使用,不重复检查可言,它实际上找到的所有节点,只是删除它们。

首先 - 为您已经遇到的代码创建一个数组。然后当你处理每件产品时,检查它是否已经被处理。如果有,则将其从文档中删除。

我用这个作为一个测试文件
<?php 
error_reporting (E_ALL); 
ini_set ('display_errors', 1); 

$XML = simplexml_load_file('NewFile.xml'); 
$productlist = $XML->xpath("/offer/products/product"); 

$prod = []; 
foreach ($productlist as $product) { 
    $code = (string)$product['code_on_card']; 
    if (in_array($code, $prod)) { 
     unset($product[0]); 
    } 
    else { 
     $prod[] = $code; 
    } 
} 

echo $XML->asXML(); 

...

<?xml version="1.0" encoding="UTF-8"?> 
<offer file_format="IOF" version="2.6" extensions="yes"> 
    <products> 
     <product id="8" producer_code_standard="GTIN13" code_on_card="KR001 B"> 
     </product> 
     <product id="8" producer_code_standard="GTIN13" code_on_card="KR001 A"> 
     </product> 
     <product id="8" producer_code_standard="GTIN13" code_on_card="KR001 B"> 
     </product> 
    </products> 
</offer> 

,输出为...

<?xml version="1.0" encoding="UTF-8"?> 
<offer file_format="IOF" version="2.6" extensions="yes"> 
    <products> 
     <product id="8" producer_code_standard="GTIN13" code_on_card="KR001 B"> 
     </product> 
     <product id="8" producer_code_standard="GTIN13" code_on_card="KR001 A"> 
     </product> 

    </products> 
</offer>