我有一个从API拉取请求中检索到的文件,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" generator="Osmosis SNAPSHOT-r26564" xapi:planetDate="2014-10-07T15:42:02Z" xmlns:xapi="http://jxapi.openstreetmap.org/">
<node id="251652819" version="6" timestamp="2013-10-19T14:03:10Z" uid="1198089" user="GeorgeKaplan" changeset="18434238" lat="48.8527413" lon="2.3333559">
<tag k="dispensing" v="yes"/>
<tag k="website" v="http://www.pharmacie-paris-citypharma.fr/"/>
<tag k="name" v="Pharmacie Citypharma"/>
<tag k="amenity" v="pharmacy"/>
</node>
<node id="251774849" version="9" timestamp="2014-07-28T21:28:26Z" uid="92075" user="Art Penteur" changeset="24411346" lat="48.8468043" lon="2.3696423">
<tag k="phone" v="0143430996"/>
<tag k="dispensing" v="yes"/>
<tag k="name" v="Pharmacie de la Rapée"/>
<tag k="amenity" v="pharmacy"/>
<tag k="opening_hours" v="Mo-Fr 08:30-20:30; Sa 09:00-19:30"/>
</node>
<node id="263262912" version="3" timestamp="2014-07-28T21:37:24Z" uid="92075" user="Art Penteur" changeset="24411346" lat="48.8446917" lon="2.3101829">
<tag k="dispensing" v="yes"/>
<tag k="amenity" v="pharmacy"/>
</node>
....etc.
我正在尝试根据属性过滤记录,基本上我正在尝试检索没有
的记录 <tag k="name" v="blahblahblah"/> field.
我一直在寻找并且经典的方式很容易做到这一点,但是由于我在做任何与xml相关的技能方面很差,我确实有几个问题:
是否可以对看起来像这样的标签应用xml过滤
<tag k="dispensing" v="yes"/>
没有
的 <tag></tag>
格式。
当节点的每个孩子都有不同的属性时,我怎样才能过滤记录,比如v,如果它看起来像这样,我会知道怎么做
<tag k="name">Pharmacie de la Rapée</tag>
但是根据收到的格式,我无法看到如何让孩子们得到我需要的出路
答案 0 :(得分:2)
要查找没有属性为<node>
的子<tag>
的所有k="name"
个元素,您可以使用XPath query之类'//node[not(tag/@k="name")]'
$xml = <<<'XML'
<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" generator="Osmosis SNAPSHOT-r26564" xapi:planetDate="2014-10-07T15:42:02Z" xmlns:xapi="http://jxapi.openstreetmap.org/">
<node id="251652819" version="6" timestamp="2013-10-19T14:03:10Z" uid="1198089" user="GeorgeKaplan" changeset="18434238" lat="48.8527413" lon="2.3333559">
<tag k="dispensing" v="yes"/>
<tag k="website" v="http://www.pharmacie-paris-citypharma.fr/"/>
<tag k="name" v="Pharmacie Citypharma"/>
<tag k="amenity" v="pharmacy"/>
</node>
<node id="251774849" version="9" timestamp="2014-07-28T21:28:26Z" uid="92075" user="Art Penteur" changeset="24411346" lat="48.8468043" lon="2.3696423">
<tag k="phone" v="0143430996"/>
<tag k="dispensing" v="yes"/>
<tag k="name" v="Pharmacie de la Rapée"/>
<tag k="amenity" v="pharmacy"/>
<tag k="opening_hours" v="Mo-Fr 08:30-20:30; Sa 09:00-19:30"/>
</node>
<node id="263262912" version="3" timestamp="2014-07-28T21:37:24Z" uid="92075" user="Art Penteur" changeset="24411346" lat="48.8446917" lon="2.3101829">
<tag k="dispensing" v="yes"/>
<tag k="amenity" v="pharmacy"/>
</node>
</osm>
XML;
$dom = new DOMDocument();
$dom->loadXML($xml);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//node[not(tag/@k="name")]');
foreach ($nodes as $node) {
echo $dom->saveXML($node);
}
<node id="263262912" version="3" timestamp="2014-07-28T21:37:24Z" uid="92075" user="Art Penteur" changeset="24411346" lat="48.8446917" lon="2.3101829">
<tag k="dispensing" v="yes"/>
<tag k="amenity" v="pharmacy"/>
</node>