2013-05-21 23 views
0

我正在運行PHP 5.4.14,並試圖使用XPath在XML文檔中進行搜索。我不知道哪個名稱空間前綴將用於每個名稱空間,因此我使用registerXPathNamespace()定義了我自己的前綴。如何在使用XPath指定自定義前綴時解決命名衝突?

問題是,如果我註冊XPath的新前綴(例如C)並且文檔已經在使用它,則XPath查詢不會使用我的前綴,而是使用原始前綴。

讓我告訴你一個代碼示例顯示此行爲:

<?php 
$body = <<<EOF                
<multistatus xmlns="DAV:" xmlns:VC="urn:ietf:params:xml:ns:carddav" xmlns:C="urn:ietf:params:xml:ns:caldav" xmlns:C1="http://calendarserver.org/ns/"> 
<response>                 
    <href>/caldav.php/jorge/contacts/</href>         
    <propstat>                 
    <prop>                 
    <current-user-principal>             
    <href>/caldav.php/jorge/</href>           
    </current-user-principal>            
    <resourcetype>               
    <collection/>               
    <VC:addressbook/>              
    </resourcetype>               
    <displayname/>               
    <VC:addressbook-home-set>            
    <href>/caldav.php/jorge/</href>           
    </VC:addressbook-home-set>            
    </prop>                 
    <status>HTTP/1.1 200 OK</status>           
    </propstat>                
</response>                 
</multistatus>                
EOF;                   

$xml = new SimpleXMLElement($body);           

$xml->registerXPathNamespace('C', 'urn:ietf:params:xml:ns:carddav');   
$xpresult = $xml->xpath('//C:addressbook-home-set');       

var_dump($xpresult);               

如果你運行它,你會看到查詢到任何結果。

出人意料的是,如果我更改註冊的前綴從Ç任何其他前綴一個尚未定義,如X,那麼查詢按預期工作:

$xml->registerXPathNamespace('X', 'urn:ietf:params:xml:ns:carddav');   
$xpresult = $xml->xpath('//X:addressbook-home-set');  

我做哪裏不對了?鑑於我無法預先知道將使用哪些前綴,是否可以設置自定義前綴並確保它不會與文檔中的其他前綴發生衝突,而且還會使用前綴醜陋的前綴代碼(MYPROGRAMUNUSEDPREFIXC)?

我知道我可以得到在文檔中使用的前綴和命名空間,但我想有固定的XPath查詢字符串。

FWIW DOMXPath也有這個問題(檢查它)。

回答

0

除非你真的想進入你選擇的任何前綴可能已經在使用的理論可能性,只是使用一個不可能的猜測。例如,前綴爲:SJDUWISKJDU