2011-04-13 2 views
1

생성 한 다음 웹 서버로 보낸 KML 파일에서 PHP를 사용하여 데이터 비트를 파싱하는 데 문제가 있습니다. 요소를 가져 와서 데이터베이스에 저장하려고합니다. 그것들을 저장하는 것은 문제가 아니며 단지 몇 가지 요소 만 빼내는 것입니다. 여기KML 파일에서 일부 요소를 구문 분석 할 때의 문제

구문 분석하려고 KML 파일 메신저의 예 엉입니다 : 나는 다음과 같은 코드를 사용하고, 나는 맨 처음 이름과 설명을 얻을 수 있어요

<?xml version="1.0" encoding="UTF-8"?> 
<kml xmlns="http://www.opengis.net/kml/2.2"> 
    <Document> 
     <name>RandomName</name> 
     <description>-</description> 
     <Style id="line"> 
      <LineStyle> 
      <color>CD0000FF</color> 
      <width>4</width> 
      </LineStyle> 
     </Style> 
     <ExtendedData> 
      <Data name="StartTime"> 
       <value>1302653118875</value> 
      </Data> 
      <Data name="EndTime"> 
       <value>1302653159274</value> 
      </Data> 
      <Data name="Type"> 
       <value>cycle</value> 
      </Data> 
     </ExtendedData> 

    <Placemark> 
     <name>PlaceName2</name> 
     <description><p>Current Altitude: <b>0.0 ft</b><br/>Current Speed: <b>0.0 m/s</b><br/>Total Distance: <b>0.608 km</b></p></description> 
     <styleUrl>#line</styleUrl> 
     <LineString> 
      <extrude>1</extrude> 
      <tessellate>1</tessellate> 
      <coordinates> 
      -122.083393,37.427768,0.0 
      -122.084395,37.427768,0.0 
      </coordinates> 
     </LineString> 
    </Placemark> 
</Document> 
</kml> 

.

function getTrackDescription($file){ 
    $xml = simplexml_load_file($file); 
    $namespace = $xml->getDocNamespaces(); 

    if(isset($namespace[""])){ 
     $xml->registerXPathNamespace("default",$namespace[""]); 
    } 

    $element= $xml->xpath('//default:description'); 
    return $element[0]; 
} 

이러한 요소를 얻을 수 있지만 다른 것을 얻으려고하면 아무 것도 얻지 못합니다. ExtendedData 내의 StartTime, EndTime 및 Type 값에 액세스 할 수 있어야합니다. 또한 장소 표시에서 설명을 가져와야합니다.

위의 코드에서 StartTime을 얻으려고 한 줄을 변경했지만 작동하지 않습니다.

$element= $xml->xpath('//default:ExtendedData/Data[name="StartTime"]/value'); 

사람이 나를 도와, 또는 올바른 방향으로 날 지점 수 있다면 정말 많은 XML을 사용하지 않은 나는 정말 greatful 일 것이다.

감사합니다.

+0

보십시오/kml/Document/ExtendedData/Data/value' ... –

+0

제가 볼 수있는 한, 해당 파일에는 네임 스페이스가 없습니다. 그렇다면 네임 스페이스를로드하고 구성하는 이유는 무엇입니까? 왜 그냥 일반적인 네임 스페이스가 아닌 문서로 취급하지 않을까요? – ircmaxell

+0

대신 네임 스페이스 URI 인'http : // www.opengis.net/kml/2.2'를 등록해야한다고 생각합니다. surce 접두어에 의존하는 것은 좋은 습관이 아닙니다. –

답변

0

네임 스페이스 "http://www.opengis.net/kml/2.2"의 접두어를 정의 했으므로이 네임 스페이스에 속하는 모든 요소에이 접두사를 사용해야합니다. 위의 코드에서 접두사가 defaultExtendedData을 찾고 있지만 접두어가없는 네임 스페이스의 다른 곳에서는 Data을 찾고 있습니다.

$xml = simplexml_load_file($file); 
var_dump($xml->xpath("//ExtendedData/Data[@name='StartTime']/value")); 

또는

$xml = simplexml_load_file($file); 
$xml->registerXPathNamespace("default","http://www.opengis.net/kml/2.2"); 
var_dump($xml->xpath("//default:ExtendedData/default:Data[@name='StartTime']/default:value")); 

은 당신이 기대하고있는 항목을 반환해야합니다 : 여기

는 옵션입니다.

+0

+1 좋은 캐치!. –