SimpleXMLElement :: xpath:使用php从osm xml文件中提取数据

时间:2015-09-13 08:39:23

标签: php xpath

我知道很少的PHP,但我不是这里的专家... - unfortunatley ...所以这个问题需要你的建议:我试图从.Osm文件中提取一些数据。 -.-你可以在overpass turbo上运行一个demo-command我希望将数据存储在数据库中 - (或者至少在excel文件中)

> /* This has been generated by the overpass-turbo wizard. The original
> search was: “hospital in rome”
> */ [out:json][timeout:25]; // fetch area “” to search in {{geocodeArea:rome}}->.searchArea; // gather results (   // query part
> for:rome “hospital”   node["amenity"="hospital"](area.searchArea);  
> way["amenity"="hospital"](area.searchArea);  
> relation["amenity"="hospital"](area.searchArea); ); // print results
> out body;
> >; out skel qt;

所以我 - 在一定数量的xml数据中 - 就像这样:

  

“tags”:{       “addr:city”:“巴塞罗那”,       “addr:housenumber”:“1”,       “addr:postcode”:“08022”,       “addr:street”:“Carrer de Torras i Pujalt”,       “舒适”:“医院”,       “contact:email”:“info@clinicasagradafamilia.com”,       “联系方式:传真”:“+ 34 932124050”,       “联系方式:电话”:“+ 34 932122300”,       “联系方式:网站”:“http://csf.com.es/”,       “名字”:“ClinícaSagradaFamília”}

所以,问题是这样的:如何存储我尝试制作某种没有成功的foreach的所有值。而且我绝对不知道为什么我们有一个迭代可以获得所有的值,为什么不可能存储在一起。

我听说我们可以在这里使用SimpleXMLElement :: xpath获取所有值和相应的值。例如:

> $raw = <<<EOF <root> {   "type": "node",   "id": 583257940,   "lat":
> 41.4134446,   "lon": 2.1426945,   "tags": {
>     "amenity": "hospital",
>     "emergency": "yes",
>     "name": "Clinica Delfos"   } }, {   "type": "node",   "id": 618312181,   "lat": 41.4138593,   "lon": 2.1970778,   "tags": {
>     "addr:city": "Barcelona",
>     "addr:housenumber": "211",
>     "addr:postcode": "08020",
>     "addr:street": "Carrer de Fluvià",
>     "amenity": "hospital",
>     "health_facility:type": "health_centre",
>     "medical_system:western": "yes",
>     "name": "CAP Sant Martí",
>     "phone": "+93 307 07 66"   } }, {   "type": "node",   "id": 876348001,   "lat": 41.3841883,   "lon": 2.1952253,   "tags": {
>     "amenity": "hospital",
>     "emergency": "yes",
>     "name": "Hospital del Mar",
>     "website": "http://www.parcdesalutmar.cat/hospitals/hospital-del-mar/index.html",
>     "wheelchair": "yes"   } },   
> 
> </root> EOF; $xml = simplexml_load_string($raw);
> 
> foreach($xml->xpath("//way") AS $way){
>     $via = $way->xpath("tag[@k='name']/@v")[0];
>     foreach($way->nd AS $nd){
>         $idnode = $nd["ref"];
>         echo $idnode .", ". $via  ."<br>";
>     } }

问题:如何在这里使用SimpleXMLElement :: xpath?

xpath-approach可能对此有所帮助:

我需要从上面选择所有数据:

>   "tags": {
>     "addr:city": "Barcelona",
>     "addr:housenumber": "1",
>     "addr:postcode": "08022",
>     "addr:street": "Carrer de Torras i Pujalt",
>     "amenity": "hospital",
>     "contact:email": "info@clinicasagradafamilia.com",
>     "contact:fax": "+34 932124050",
>     "contact:phone": "+34 932122300",
>     "contact:website": "http://csf.com.es/",
>     "name": "Cliníca Sagrada Família"   }

这意味着我必须在XML文档中的任何位置选择所有上述元素。

tag [@ k ='name']选择具有k属性值等于name的当前上下文节点的子节点。然后,/ @ v返回v属性。

最后我必须得到以下数据集:

>   "tags": {
>     "addr:city": "Barcelona",


 "addr:housenumber": "1",
    "addr:postcode": "08022",
    "addr:street": "Carrer de Torras i Pujalt",
    "amenity": "hospital",
    "contact:email": "info@clinicasagradafamilia.com",
    "contact:fax": "+34 932124050",
    "contact:phone": "+34 932122300",
    "contact:website": "http://csf.com.es/",
    "name": "Cliníca Sagrada Família"   }

btw - 你可以在立交桥turbo

上运行一个demo-command

然后你会得到很多结果.... 问题:如何将这些结果存储在excel或mysql中?

我真的很想收到你的消息

非常感谢提前

1 个答案:

答案 0 :(得分:1)

"tags": { "addr:city": "Barcelona", "addr:housenumber": "1", 
 "addr:postcode": "08022", "addr:street": "Carrer de Torras i Pujalt", 
 "amenity": "hospital", "contact:email": "info@clinicasagradafamilia.com", 
 "contact:fax": "+34 932124050", "contact:phone": "+34 932122300", 
 "contact:website": "http://csf.com.es/", "name": "Cliníca Sagrada Família" }

  

问题:如何在这里使用SimpleXMLElement :: xpath?

XPath适用于XML。这是文本数据,看起来像JSON结构。虽然XPath 3.1具有处理JSON结构数据的功能,但PHP不通过其XPath处理器支持它。

  

这意味着我必须在XML文档中的任何位置选择所有上述元素。

在您的示例PHP代码中只有一个元素<root>。您可以使用xpath /root选择它,但它不会对您进一步提供帮助,您仍然可以使用非结构化JSON-as-a字符串。

相反,check out json_decode,它意味着解析JSON并将其转换为PHP变量。该页面显示了几个如何做到这一点的例子。