我有一个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
。