2016-12-14 112 views
1

XML:查詢多名稱空間的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:posList。我嘗試以下

的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')); 

如果我查詢列弗屬性:地區,我可以讓他們,但是,我似乎無法檢索GML :posList的值或例如gml:exterior的屬性。我知道我做錯了什麼,我只是沒有看到什麼...

回答

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

謝謝托馬斯,我會試試看 –