使用php中的属性过滤xml记录

时间:2014-10-08 12:05:42

标签: php xml

我有一个从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相关的技能方面很差,我确实有几个问题:

  1. 是否可以对看起来像这样的标签应用xml过滤

    <tag k="dispensing" v="yes"/> 
    

    没有

     <tag></tag>
    

    格式。

  2. 当节点的每个孩子都有不同的属性时,我怎样才能过滤记录,比如v,如果它看起来像这样,我会知道怎么做

      <tag k="name">Pharmacie de la Rapée</tag> 
    

    但是根据收到的格式,我无法看到如何让孩子们得到我需要的出路

1 个答案:

答案 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>
相关问题