Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用XPath指定自定义前缀时,如何解决命名冲突?_Php_Xml Parsing - Fatal编程技术网

Php 使用XPath指定自定义前缀时,如何解决命名冲突?

Php 使用XPath指定自定义前缀时,如何解决命名冲突?,php,xml-parsing,Php,Xml Parsing,我正在运行PHP5.4.14,并尝试使用XPath在XML文档中进行搜索。我不知道每个名称空间将使用哪个名称空间前缀,所以我使用registerXPathNamespace()定义自己的前缀 问题是,如果我为XPath注册了一个新前缀(例如,C),并且文档已经在使用它,XPath查询将不会使用我的前缀,而是使用原始前缀 让我向您展示一个示例代码来显示此行为: <?php $body = <<<EOF

我正在运行PHP5.4.14,并尝试使用XPath在XML文档中进行搜索。我不知道每个名称空间将使用哪个名称空间前缀,所以我使用
registerXPathNamespace()
定义自己的前缀

问题是,如果我为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);                                                        
我做错什么了吗?鉴于我无法预先知道将使用哪些前缀,除了使用难看的MYPROGRAMUNUSEDPREFIXC前缀外,是否可以设置自定义前缀并确保它不会与文档中的其他前缀冲突

我知道我可以获得文档中使用的前缀和名称空间,但我希望有固定的XPath查询字符串


FWIW-DOMXPath也有这个问题(请检查)。

除非您真的想探讨您选择的任何前缀可能已经在使用的理论可能性,否则请使用一个不太可能的前缀来猜测。比如前缀:SJDUWISKJDU

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