我有一个xml的联系文件,如下所示
contacts.xml
<?xml version="1.0"?>
<contacts>
<contact>
<contact_no>9782547000</contact_no>
<Name>xName</Name>
<Email>xEmail@gmail.com</Email>
</contact>
<contact>
<contact_no>9782547000</contact_no>
<Name>yName</Name>
<Email>xEmail@gmail.com</Email>
</contact>
<contact>
<contact_no>9782547012</contact_no>
<Name>xName</Name>
<Email>xEmail@gmail.com</Email>
</contact>
<contact>
<contact_no>9782547011</contact_no>
<Name>xName</Name>
<Email>xEmail@gmail.com</Email>
</contact>
<contact>
<contact_no>9782547012</contact_no>
<Name>xName</Name>
<Email>xEmail@gmail.com</Email>
</contact>
<contact>
<contact_no>9782547000</contact_no>
<Name>xName</Name>
<Email>xEmail@gmail.com</Email>
</contact>
</contacts>
在这里您可以看到标记contact_no
有一些重复。我想删除重复并只存储不同的联系人没有使用PHP保存xml文件
在应用过程之后,xml将如下所示,具有三个不同的联系人。
contact.xml
<?xml version="1.0"?>
<contacts>
<contact>
<contact_no>9782547000</contact_no>
<Name>xName</Name>
<Email>xEmail@gmail.com</Email>
</contact>
<contact>
<contact_no>9782547012</contact_no>
<Name>xName</Name>
<Email>xEmail@gmail.com</Email>
</contact>
<contact>
<contact_no>9782547011</contact_no>
<Name>xName</Name>
<Email>xEmail@gmail.com</Email>
</contact>
<contacts>
我在DOMDocument ad simpleXMLElement中搜索但找不到成功。 是否有任何功能或方法来实现这一点。提前谢谢。
答案 0 :(得分:0)
使用simplexml
和xpath
:
$xml = simplexml_load_string($x); // assume XML in $x
// create array with all non-unique <contact_no>
$ids = $xml->xpath("/contacts/contact/contact_no");
$ids = array_diff(array_count_values(array_map("strval", $ids)), array("1"));
// select each non-unique entry and delete it
foreach ($ids as $id => $count) {
$results = $xml->xpath("/contacts/contact[contact_no = '$id']");
for ($i = $count; $i > 0; $i--) unset($results[$i][0]);
}
看到它有效:https://eval.in/84939
<强>评论强>
line 04:
选择所有<contact_no>
并将其放入array $ids
line 05:
这些是对象,所以我们......
1.使用array_map()
将其转换为string
2.使用array_count_values()
将contact_no
作为key
,将其计为value
3.使用array_diff()
删除所有唯一元素(value = 1
)
line 09:
选择<contact>
存储在no
中$id
的所有$results
到line 10:
$results
循环显示unset()
和<contact>
所有{{1}}但只有一个
答案 1 :(得分:-1)
我通过DomDocument开发了这段代码。 这是我的xml文件,我将其命名为contact.xml。请看看。
<?xml version="1.0" encoding="UTF-8"?>
<contacts>
<contact>
<contact_no>9782547000</contact_no>
<Name>xName</Name>
<Email>xEmail@gmail.com</Email>
</contact>
<contact>
<contact_no>9782547000</contact_no>
<Name>yName</Name>
<Email>xEmail@gmail.com</Email>
</contact>
<contact>
<contact_no>9782547012</contact_no>
<Name>xName</Name>
<Email>xEmail@gmail.com</Email>
</contact>
<contact>
<contact_no>9782547011</contact_no>
<Name>xName</Name>
<Email>xEmail@gmail.com</Email>
</contact>
<contact>
<contact_no>9782547012</contact_no>
<Name>xName</Name>
<Email>xEmail@gmail.com</Email>
</contact>
<contact>
<contact_no>9782547000</contact_no>
<Name>xName</Name>
<Email>xEmail@gmail.com</Email>
</contact>
</contacts>
现在我已经为它开发了这样的功能:
<?php
$dom=new DOMDocument();
$dom->load("contact.xml");
$tt=$dom->getElementsByTagName("contact_no");
foreach ($tt as $tt1){
$dt= new DOMXPath($dom);
$dtlist=$dt->query('/contacts/contact/contact_no[text()="'.$tt1->nodeValue.'"]');
$count=0;
foreach($dtlist as $tmt){
if($count!=0){
$tmt->parentNode->parentNode->removeChild($tmt->parentNode);
}
$count++;
}
}
$dom->saveXML();
$dom->save("contact.xml");
?>
希望您能享受这些代码。如果您有任何疑问,请与我们联系。
答案 2 :(得分:-2)
我们可以通过使用PHP的SimpleXMl函数进行xml操作并使用循环来解决这个问题,我们可以在contact_no匹配时删除父元素。
<?php
$str = <<<_END
<?xml version="1.0"?>
<contacts>
<contact>
<contact_no>9782547000</contact_no>
<Name>xName</Name>
<Email>xEmail@gmail.com</Email>
</contact>
<contact>
<contact_no>9782547000</contact_no>
<Name>yName</Name>
<Email>xEmail@gmail.com</Email>
</contact>
<contact>
<contact_no>9782547012</contact_no>
<Name>xName</Name>
<Email>xEmail@gmail.com</Email>
</contact>
<contact>
<contact_no>9782547011</contact_no>
<Name>xName</Name>
<Email>xEmail@gmail.com</Email>
</contact>
<contact>
<contact_no>9782547012</contact_no>
<Name>xName</Name>
<Email>xEmail@gmail.com</Email>
</contact>
<contact>
<contact_no>9782547000</contact_no>
<Name>xName</Name>
<Email>xEmail@gmail.com</Email>
</contact>
<contacts>
_END;
$xml=simplexml_load_string($str);
$seen=array();
$len=$xml->contact->count();
for($i=0;$i<$len;$i++){
$key=(string) $xml->contact[$i]->contact_no;
if (isset($seen[$key])) {
unset($xml->contact[$i]);
$len--;
$i--;
}else{
$seen[$key]=1;
}
}
echo $xml->asXML();
?>
如果您有任何疑问,请与我们联系。