2011-03-17 3 views
3

이 xpath 쿼리가 나를 미치게합니다. 내가 뭘 하려는지 특정 코스 유형에 대한 골프 코스의 XML 파일 (이 경우에는 Google Map API와 함께 사용하기위한 kml 파일)을 검색하고 각각 <Placemark> 요소를 잡아서 새 xml 객체를 만들 수 있습니다. 그 결과를 새로운 쿼리로 추가 필터링 할 수 있습니다. 문제는 내가 어떤 도움을 크게 감상 할 수DOM XPath 쿼리 도움말

$xml = '<?xml version="1.0" encoding="UTF-8"?> 
<kml xmlns="http://earth.google.com/kml/2.1"> 
    <Document> 
     <Placemark id="placemark3"> 
      <name>Test Country Club</name> 
      <description> 
       <![CDATA[ 
       <div class="contact">Post Office Box 329 <a href="#" target="_blank">website</a></div> 
       ]]> 
      </description> 
      <alpha>a</alpha> 
      <position>2</position> 
      <type>Public/Daily Fee</type> 
      <styleUrl>#nineholeStyle</styleUrl> 
      <Point> 
       <coordinates>-79.285576,37.111809</coordinates> 
      </Point> 
     </Placemark> 
    </Document> 
</kml>'; 

$dom = new DOMDocument(); 
$dom->loadXML($xml); 
$xpath = new DOMXPath($dom); 

//trying to get any Placemark element where type child matches a specific query 
//in this case we want to search for Public/Daily Fee and return the placemark and everything inside it. 
$query = $xpath->query("//Placemark[type='Public/Daily Fee']/ancestor::Placemark");; 

    foreach ($query as $result) { 
    //eventually want to merge each result into new xml object to be further filtered 
    } 

각 일치 <Placemark> 요소를 얻는 방법을 알아낼 수없는 것입니다. 감사합니다.

+0

[KML 파일을 mysql/xpath 및 x quires에로드 중] 가능한 복제본 (http://stackoverflow.com/questions/5341039/loading-kml-file-in-to-mysql-xpath-and-x- quires) –

+0

@Alejando 사실이지만, 해답이 없습니다. 아마도 병합되어야합니다. – Gordon

답변

8

쿼리 전에 register the XML namespace을 입력하지 않았습니다.

// register it 
$xpath->registerNamespace('kml', "http://earth.google.com/kml/2.1"); 

// and use it, too ! 
$query = $xpath->query("//kml:Placemark[kml:type='Public/Daily Fee']"); 

은 (표현식의 ancestor::kml:Placemark 내가 그것을 왼쪽으로, 아무 의미하지 않았다.) 문제의 네임 스페이스가 기본 네임 스페이스가있는 경우에도 XPath 쿼리의 네임 스페이스 접두사를 사용할 수 있어야합니다

(예 : 귀하의 경우).

요소 <kml xmlns="http://earth.google.com/kml/2.1"><kml:kml xmlns:kml="http://earth.google.com/kml/2.1">와 같습니다.

그러나 /kml의 XPath 쿼리는 /kml:kml과 같지 않습니다. 후자는 두 요소 (앞에서 kml 네임 스페이스가 등록되어있을 때)와 일치 할 것이고, 전자는 네가 무엇을 하든지 상관없이 일치 할 것입니다.

또한 이 아니므로 XML 문서에 사용 된 동일한 네임 스페이스 접두사를 사용하지 마십시오.

<kml:kml xmlns:kml="http://earth.google.com/kml/2.1"> 
    <kml:Document /> 
</kml:kml> 

그런 다음 당신은 여전히이 작업을 수행 할 수 있습니다 :

는 XML 문서가이라고 가정

$xpath->registerNamespace('foo', "http://earth.google.com/kml/2.1"); 
$query = $xpath->query("/foo:kml/foo:Document"); 

하고 올바른 결과를 다시 얻을. 네임 스페이스 접두사는 단지 축약 형입니다.

+0

아 감사합니다. 하지만 초기 쿼리가 맞았습니까? 나는 결과를 얻지 못하고있다. 단지 $ result-> saveXML을 사용해야 만 하는가? – Jamie

+1

@ Jamie : 제 답변에서 XPath를 변경했습니다. 한 번에'kml' 접두어를 잊어 버렸습니다. 지금 일해야한다. 'ancestor ::'부분은 전혀 필요 없다는 것에주의하십시오. – Tomalak