使用php从xml文件中提取不同的标记值

时间:2014-01-02 09:09:21

标签: php xml

我有一个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中搜索但找不到成功。 是否有任何功能或方法来实现这一点。提前谢谢。

3 个答案:

答案 0 :(得分:0)

使用simplexmlxpath

$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的所有$resultsline 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();
    ?>

如果您有任何疑问,请与我们联系。