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

在php中使用属性过滤xml记录,php,xml,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" versi

我从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> 
    
    Rapée药房
    
    但以收到的格式,我看不到一条出路,如何得到我需要的孩子

  • 要查找所有属性为
    k=“name”
    且没有子元素的
    元素,可以使用like
    '//节点[not(tag/@k=“name”)]


    例子:
    $xml=saveXML($node);
    }
    

    输出:
    
    
    Checkout
    XPath
    它将帮助您实现所需。您的xml非常容易误导。您所有的
    节点都是自关闭相关的:谢谢您的帮助!您是否知道如何为每个具有k=“name”标记的元素获取v属性?基本上,如何访问$node element的确切标记k=“name”子元素我尝试过这样做,但是检索到的列表长度为0,这是不确定的,是否有我缺少的内容?做了几乎相同的事情。你知道我错过了什么吗?我还有一个问题。我试着独自一人去做,我到处找,但是,就我的一生而言,我找不到答案。假设我想同时获得每个节点的LAT和LON属性,这些节点有一个标记k=“name”子节点,但也有来自标记k=“name”的v值。既然没有getChild()函数或类似的东西,那怎么办呢?
    $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>