2015-09-13 33 views
-4

我知道小小的PHP,但我不是这里的专家...... - unfortunatley ...所以这个问题需要你的建议:我试图从一个数据提取一些数据.Osm文件。 -.-你可以在立交桥涡轮跑这里来演示命令我希望将数据存储在数据库 - (或者至少在一个excel文件)SimpleXMLElement :: xpath:从php osx提取数据xml文件

> /* 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的量内 - 数据 - 这样的事情:

“标签”:{ “地址:城市”: “巴塞罗那”, “地址:housenumber”: “1”, “地址:邮编”: “08022” , “addr:street”:“Carrer de Torras i Pujalt”, “amenity”:“hospital”, “contact:email”:“[email protected]”, “联系方式:传真”: “+34 932124050”, “联系:电话”: “+34 932122300”, “联系人:网站”: “http://csf.com.es/”, “名”: “CLÍNICA圣家堂”}

所以,问题是这样的:如何存储所有这些值,我试图做一些没有成功的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的方法,可以帮助这里:

我需要从上述选择中的所有数据:

> "tags": { 
>  "addr:city": "Barcelona", 
>  "addr:housenumber": "1", 
>  "addr:postcode": "08022", 
>  "addr:street": "Carrer de Torras i Pujalt", 
>  "amenity": "hospital", 
>  "contact:email": "[email protected]", 
>  "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个属性值的名称相同。然后,从那里,/ @ v返回v属性。

Finallyi必须getthe以下数据集:

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


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

顺便说一句 - 你可以在立交桥涡轮跑这里来演示命令

那么你得到很多结果.... 问题:如何将结果存储在excel或mysql中?

我真的很喜欢听到你

提前

回答

1
"tags": { "addr:city": "Barcelona", "addr:housenumber": "1", 
"addr:postcode": "08022", "addr:street": "Carrer de Torras i Pujalt", 
"amenity": "hospital", "contact:email": "[email protected]", 
"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字符串。

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