从SimpleXML Object中删除重复项

时间:2014-12-20 04:47:50

标签: php simplexml

我希望能得到一些我正在努力解决的问题。我使用SimpleXML解析XML提要但是,我试图删除重复项。

我做了很多研究,似乎无法对此进行排序。我认为最好的方法是array_unique但是,包含解析输出的变量$event似乎无法使用它。

链接到脚本http://www.mesquiteweather.net/inc/inc-legend.php

我正在使用的代码。任何帮助将不胜感激。我花了几天时间试图解决这个问题。

// Lets parse the data
$entries = simplexml_load_file($data);
if(count($entries)):
    //Registering NameSpace
    $entries->registerXPathNamespace('prefix', 'http://www.w3.org/2005/Atom');
    $result = $entries->xpath("//prefix:entry");

    foreach ($result as $entry):
        $event = $entry->children("cap", true)->event;

        endforeach;
endif;

// Lets creat some styles for the list
    $legendStyle = "margin:10px auto 10px auto;";

$legend .= "<table style='$legendStyle' cellspacing='5px'>";
$legend .= "<tr>";

$i = 1;
foreach ($result as $entry) {
    $event = $entry->children("cap", true)->event;
//Set the alert colors for the legend
   include ('../inc-NWR-alert-colors.php');
   $spanStyle   = "background-color:{$alertColor};border:solid 1px #333;width:15px;height:10px;display:inline-block;'> </span><span style='font-size:12px;color:#555;";
    $legend .= "<td> <span style='$spanStyle'> $event</span></td>";
    if($i % 5 == 0)
        $legend .= "</tr><tr>";
    $i++;
}

$legend .= "</tr>";
$legend .= "</table>";


echo $legend;

1 个答案:

答案 0 :(得分:1)

下面的示例使用DOM而不是SimpleXML,因为DOM提供了方便的方法C14N()来创建canonical XML

创建规范XML的基本思想是,两个实际相同的节点将具有相同的序列化输出,无论它们在源文档中的表示如何。

例如,属性顺序对元素无关紧要,因此:

<element foo="Foo" bar="Bar"/>`

<element bar="Bar" foo="Foo"/>

实际上完全相同。规范化它们,并为每个产生的XML将是:

<element bar="Bar" foo="Foo"></element>

如果迭代所需的元素来创建数组并使用它们的规范表示作为键,那么最终将得到一组唯一的节点。


实施例

$dom = new DOMDocument();
$dom->load("http://alerts.weather.gov/cap/ca.atom");

// Create an array of unique events
$events = [];
foreach ($dom->getElementsByTagNameNS("urn:oasis:names:tc:emergency:cap:1.1", "event") as $event) {
    $events[$event->C14N()] = $event;
}

// ... do whatever other stuff you need ...

// Output event text.
foreach ($events as $event) {
    echo "$event->nodeValue\n";
}

输出:

Coastal Flood Advisory
High Surf Advisory
Wind Advisory
Winter Weather Advisory
Beach Hazards Statement