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