我希望能得到一些我正在努力解决的问题。我使用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;
答案 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