繁体   English   中英

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-expression匹配的所有匹配项

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

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

谢谢!

此XPath表达式:

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

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

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

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

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


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

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

将从选择realEstateElementsaddress/postcode开始与“31”,所有那些与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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM