PHP DOMXPath 查询的意外结果


Unexpected Result from PHP DOMXPath query

我有一个xml文档的结构:

<realestates:realEstates xmlns:ns2="http://rest.immobilienscout24.de/schema/platform/gis/1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:common="http://rest.immobilienscout24.de/schema/common/1.0" xmlns:realestates="http://rest.immobilienscout24.de/schema/offer/realestates/1.0">
  <realEstateList>
    <typeList>
      <realEstateElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:offerlistelement="http://rest.immobilienscout24.de/schema/offer/listelement/1.0">
        <address>
          <postcode>31874</postcode>
        </address>
      </realEstateElement>
    </typeList>
  </realEstateList>
</realestates:realEstates>

现在我想选择所有不以邮政编码开头的 realEstateElement-elemets,即邮政编码中的 31,因为我想从文档中删除它们。

我尝试选择与此 xpath 表达式匹配的所有匹配项

typeList//realEstateElement/address[starts-with(postcode,"31")]

但我得到的是什么都没有。如果我在开头删除typeList,我会得到所有匹配的邮政编码元素,而不是realEstateElement元素。有没有人知道如何以简单的方式删除所有不匹配的元素?

谢谢!

这个 XPath 表达式:

//realEstateElement/address[starts-with(postcode,"31")]

选择每个后代节点realEstateElement节点内的所有address节点。这是一个包含两个步骤的 XPath 表达式。最后一步始终是您选择的步骤。前面的步骤仅为其他步骤创建上下文。每个步骤可以有一个或多个谓,其格式为 *布尔表达式 * ] [ 。将每个选定的节点与其谓词进行比较,并且只有与其匹配的节点才会保留在上下文或最终结果中。

因此,如果要选择与谓词匹配的realEstateElement节点,则需要将其作为最后一步。路径的其余部分(address/postcode(可以在realEstateElement节点上下文中的谓词中使用:

//realEstateElement[starts-with(address/postcode,"31")]

这将返回包含address元素的所有realEstateElement节点,该元素包含文本内容以 31 开头的 postcode 元素。


注 1:如果必须进一步限制节点,可以添加更多谓词:

//realEstateElement[starts-with(address/postcode,"31")][not(starts-with(address‌​/postcode, "318"))] 

这将address/postcode以"31"开头的realEstateElements中进行选择,所有以 318 开头的。谓词在上一个谓词或步骤创建的上下文中有效。


注意 2:如果您需要在 XPath 中包含其中任何一个命名空间,则命名空间将很重要,到目前为止似乎并非如此。如果需要这样做,则必须注册一个前缀,以便可以在表达式中使用选择器:

$xmldoc->registerXPathNamespace('re', 'http://rest.immobilienscout24.de/schema/offer/realestates/1.0');

前缀不必与文档中声明的前缀匹配(如果它是默认命名空间,则可能不存在(。有了这个,你可以使用这样的表达式:

/re:realEstates/realEstateList/typeList/realEstateElement[starts-with(address/postcode,"31")]

它还使用绝对表达式选择realEstateElement