我知道很少的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中?
我真的很想收到你的消息
非常感谢提前
答案 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变量。该页面显示了几个如何做到这一点的例子。