簡體   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