2016-12-14 4 views
1

XML : posList을 :쿼리 멀티 네임 스페이스 XML

<lev:Locatie axisLabels="x y" srsDimension="2" srsName="epsg:28992" uomLabels="m m"> 
    <gml:exterior xmlns:gml="http://www.opengis.net/gml"> 
     <gml:LinearRing> 
      <gml:posList> 
      222518.0 585787.0 222837.0 585875.0 223229.0 585969.0 223949.0 586123.0 223389.0 586579.0 223305.0 586564.0 222690.0 586464.0 222706.0 586319.0 222424.0 586272.0 222287.0 586313.0 222054.0 586517.0 221988.0 586446.0 222174.0 586305.0 222164.0 586292.0 222172.0 586202.0 222232.0 586143.0 222279.0 586149.0 222358.0 586076.0 222422.0 586018.0 222518.0 585787.0 
      </gml:posList> 
     </gml:LinearRing> 
    </gml:exterior> 
</lev:Locatie> 

나는 GML에 도착해야합니다. 나는 다음과 같은

SimpleXML을 시도 :

$xmldata  = new SimpleXMLElement($xmlstr); 
$xmlns  = $xmldata->getNamespaces(true); 

$retval = array(); 

foreach($xmldata as $attr => $child) { 
    if ((string)$child !== '') { 
     $retval[$attr] = (string)$child; 
    } 
    else { 
     $retval[$attr] = $child->children($xmlns['gml']); 
    } 
} 
var_export($retval); 

XPath는 :

$domdoc = new DOMDocument(); 
$domdoc->loadXML($xml); 
$xpath = new DOMXpath($domdoc); 
$xpath->registerNamespace('l', $xmlns['lev']); 
$xpath->registerNamespace('g', $xmlns['gml']); 
var_export($xml->xpath('//g:posList')); 

나는 레프에 대한 속성 조회 할 경우 : Locatie를, 내가 그들을 얻을 수는 있지만, 나는 GML을 검색 할 수 없습니다 보인다 : posList의 값 또는 eg gml : external의 속성. 내가 무엇인가 잘못하고 있다는 것을 안다. 나는 무엇을 보지 못한다 ...

답변

1

DOMXpath 인스턴스에 네임 스페이스를 등록했지만 SimpleXMLElement::xpath() 호출을 사용한다. 그것은 작동하지 않습니다. SimpleXMLElement::registerXpathNamespace()을 사용하여 SimpleXMLElement에 등록하거나 DOM으로 전환 한 후 DOMXpath::evaluate()을 사용할 수 있습니다. 속성에는 접두사가 없으므로 네임 스페이스에 없습니다. gml:exterior에는 특성이 없으며 네임 스페이스 정의 만 있습니다. 그것은 속성처럼 보이지만 파서에 의해 다르게 처리됩니다.

DOMXpath::evaluate()의 좋은 점은 Xpath 표현식에 따라 노드 목록 또는 스칼라가 될 수 있다는 것입니다. 따라서 값을 직접 가져올 수 있습니다.

예를 들어 gml:posList :

$xmlString = <<<'XML' 
<lev:Locatie axisLabels="x y" srsDimension="2" srsName="epsg:28992" uomLabels="m m" xmlns:lev="urn:lev"> 
    <gml:exterior xmlns:gml="http://www.opengis.net/gml"> 
     <gml:LinearRing> 
      <gml:posList> 
      222518.0 585787.0 222837.0 
      </gml:posList> 
     </gml:LinearRing> 
    </gml:exterior> 
</lev:Locatie> 
XML; 

$document = new DOMDocument(); 
$document->loadXML($xmlString); 
$xpath = new DOMXpath($document); 
$xpath->registerNamespace('g', 'http://www.opengis.net/gml'); 
var_export( 
    $xpath->evaluate('normalize-space(//g:posList)') 
); 

출력 :

'222518.0 585787.0 222837.0' 

normalize-space() 단일 공간 공백의 모든 서열을 대체하고 그 결과를 트리밍하는 XPath 기능이다. 이것은 문자열 함수이므로 위치 경로에서 첫 번째 노드의 암시 적 캐스트를 트리거합니다.

+0

덕분에 힙이 토마스, 나는 그것을 시험해 볼 것입니다. –