0
WFS 요청에서 GeoServer로 XML (또는 GML) 응답을 구문 분석하려고합니다.PHP 구문 분석 WFS XML 응답
내 목표는 그때 표시 할 수있는 좋은 깔끔한 배열, 수출, 등 등으로 XML을 추출하는 것입니다
내 XML은 다음과 같습니다
<?xml version="1.0" encoding="UTF-8"?>
<wfs:FeatureCollection numberOfFeatures="52" timeStamp="2012-06-28T10:11:02.193Z" xsi:schemaLocation="http://squirrel.bis.local/bis_workspace http://squirrel.bis.local:8080/geoserver/wfs?service=WFS&version=1.1.0&request=DescribeFeatureType&typeName=bis_workspace%3Abis_1_priority_species http://www.opengis.net/wfs http://squirrel.bis.local:8080/geoserver/schemas/wfs/1.1.0/wfs.xsd" xmlns:opengeo="http://opengeo.org" xmlns:ogc="http://www.opengis.net/ogc" xmlns:bis_workspace="http://squirrel.bis.local/bis_workspace" xmlns:world="http://world.opengeo.org" xmlns:wfs="http://www.opengis.net/wfs" xmlns:medford="http://medford.opengeo.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ows="http://www.opengis.net/ows" xmlns:gml="http://www.opengis.net/gml" xmlns:usa="http://usa.opengeo.org" xmlns:xlink="http://www.w3.org/1999/xlink">
<gml:featureMembers>
<bis_workspace:bis_1_priority_species gml:id="bis_1_priority_species.fid--2f086452_138094a10a0_116d">
<bis_workspace:id>27407951</bis_workspace:id>
<bis_workspace:gridref>SN123456</bis_workspace:gridref>
<bis_workspace:species>Milvus milvus</bis_workspace:species>
<bis_workspace:common>Red Kite</bis_workspace:common>
<bis_workspace:date>2004</bis_workspace:date>
<bis_workspace:comments>
</bis_workspace:comments>
<bis_workspace:family>Accipitridae</bis_workspace:family>
</bis_workspace:bis_1_priority_species>
<bis_workspace:bis_1_priority_species gml:id="bis_1_priority_species.fid--2f086452_138094a10a0_116e">
<bis_workspace:id>28064165</bis_workspace:id>
<bis_workspace:gridref>SN123456</bis_workspace:gridref>
<bis_workspace:species>Lutra lutra</bis_workspace:species>
<bis_workspace:common>European Otter</bis_workspace:common>
<bis_workspace:date>09/11/2001</bis_workspace:date>
<bis_workspace:comments>spraint</bis_workspace:comments>
<bis_workspace:family>Mustelidae</bis_workspace:family>
</bis_workspace:bis_1_priority_species>
</gml:featureMembers>
</wfs:FeatureCollection>
내가 말을하고 싶습니다 결과는 다음과 같이합니다 :
Array
(
[0] => Array
(
[id] => 27407951
[gridref] => SN123456
[species] => Milvus milvus
[common] => Red Kite
[date] => 2004
[comments] =>
[family] => Accipitridae
)
[1] => Array
(
[id] => 28064165
[gridref] => SN123456
[species] => Lutra lutra
[common] => European Otter
[date] => 09/11/2001
[comments] => spraint
[family] => Mustelidae
)
[2] => Array
(
[id] => 27516850
[gridref] => SN123456
[species] => Tyto alba
[common] => Barn Owl
[date] => 2004
[comments] => Pair, nest box in tree, 2 chicks
[family] => Tytonidae
)
를)
등 등
다음 코드를 사용하고 있습니다. 작동하지만 어리석게 비효율적입니다. XML의 모든 레코드에 대해 코드는 전체 XML 응답을 구문 분석해야합니다. 20-30 개의 레코드 만 있으면이 XML 응답에 수천 개의 레코드가 포함될 수 있습니다.
XML 파일을 1 스윕 만 사용하여이 어레이를 빌드하는 방법이 있습니까? 나는 또한 WFS XML의 네임 스페이스를 처리하기 위해 고투 한
//Parse the XML
$xml = simplexml_load_string($wfs_reply, NULL, NULL, "http://squirrel.bis.local/bis_workspace");
$xml->registerXPathNamespace('wfs', 'http://www.opengis.net/wfs');
$xml->registerXPathNamespace('gml', 'http://www.opengis.net/gml');
$xml->registerXPathNamespace('bis_workspace', 'http://squirrel.bis.local/bis_workspace');
$count = 0;
$feature_members_array = array();
$feature_members_layer_path = "//bis_workspace:" . $layer_name; //I.e. '//bis_workspace:bis_1_priority_species'
foreach($xml->xpath($feature_members_layer_path) as $feature_members_raw)
{
$feature_member_id = $feature_members_raw->xpath('//bis_workspace:id');
$feature_members_array[$count]['id'] = (string)$feature_member_id[$count];
$feature_member_gridref = $feature_members_raw->xpath('//bis_workspace:gridref');
$feature_members_array[$count]['gridref'] = (string)$feature_member_gridref[$count];
$feature_member_species = $feature_members_raw->xpath('//bis_workspace:species');
$feature_members_array[$count]['species'] = (string)$feature_member_species[$count];
$feature_member_common = $feature_members_raw->xpath('//bis_workspace:common');
$feature_members_array[$count]['common'] = (string)$feature_member_common[$count];
$feature_member_date = $feature_members_raw->xpath('//bis_workspace:date');
$feature_members_array[$count]['date'] = (string)$feature_member_date[$count];
$feature_member_comments = $feature_members_raw->xpath('//bis_workspace:comments');
$feature_members_array[$count]['comments'] = (string)$feature_member_comments[$count];
$feature_member_family = $feature_members_raw->xpath('//bis_workspace:family');
$feature_members_array[$count]['family'] = (string)$feature_member_family[$count];
$count ++;
}
많은 감사, 스티브
감사 Lubar를 얻을 - 이것이 내가 결국 한 정확히 것입니다. JSON에 대한 PHP의 지원은 매우 훌륭하며 시간이별로없는 배열을 정렬했습니다. 흥미롭게도 그 대답은 꽤 작아 보였으므로 약간의 대역폭을 절약 할 수있었습니다. – user8262