Я пишу скрипт, который читает и обрабатывает документ KML (xml). Ниже приведен фрагмент документа, который я читаю:
<?xml version="1.0" encoding="UTF-8"?> <!-- Generated by Feature Manipulation Engine 2009 (Build 5658) --> <kml xmlns="http://earth.google.com/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom"> <Document> <name>South Australia</name> <visibility>1</visibility> <description><![CDATA[Statistical Local Area 2008]]></description> <Folder id="kml_ft_SA_SLA08"> <name>SA_SLA08</name> <Placemark id="kml_1"> <name>Mitcham (C) - West</name> <Style> <!-- style info blah blah --> </Style> <Polygon> <!-- blah blah --> </Polygon> </Placemark> <!-- snip lots more Placemarks --> </Folder> </Document> </kml>
Проблема, с которой я столкнулась, заключается в использовании XPath для выбора чего-либо из этого!
$doc = new DOMDocument(); $doc->load('myfile.xml'); // returns true $xp = new DOMXPath($doc); $places = $xp->query("//Placemark"); echo $places->length; // --> 0 ??!!?? $everything = $xp->query("//*"); // (so I know that the XPath isn't fully borked) echo $everything->length; // --> 2085
Что тут происходит?
<?php $doc = new DOMDocument(); $doc->load('file.xml'); // returns true $xp = new DOMXPath($doc); $xp->registerNamespace('ge', 'http://earth.google.com/kml/2.2'); $places = $xp->query("//ge:Placemark"); echo $places->length; // --> 0 ??!!?? $everything = $xp->query("//*"); // (so I know that the XPath isn't fully borked) //echo $doc->saveXML();
По-видимому, вам нужно зарегистрировать пространство имен «ge» и запросить его как таковое, по крайней мере, это то, что я придумал после нескольких минут поиска в Google. Думаю, иногда мы забываем, что имеем дело с пространствами имен: p