[英]PHP 7 DomDocument xpath query parent parameter
我正在嘗試使用eBaysvc.xsd不僅驗證 xml,而且構建 xml 本身:
因此,作為 $API 傳遞
添加爭議
我想檢索這樣的 xml:
<?xml version="1.0" encoding="utf-8"?>
<AddDisputeRequest xmlns="urn:ebay:apis:eBLBaseComponents">
<DisputeExplanation> Tokens </DisputeExplanation>
<DisputeReason> Tokens </DisputeReason>
<ItemID> string </ItemID>
<TransactionID> string </TransactionID>
<OrderLineItemID> string </OrderLineItemID>
<Version> string </Version>
<RequesterCredentials>
<eBayAuthToken> string </eBayAuthToken>
</RequesterCredentials>
<WarningLevel> Tokens </WarningLevel>
</AddDisputeRequest>
我使用 xpath->query 構建了一個腳本,該腳本應該根據多個參數過濾元素,到目前為止我得到了這個:
$Nodes = $xpath->query('//xs:element[(xs:annotation/xs:appinfo/ebl:CallInfo/ebl:CallName/text()="'.$API.'" or xs:annotation/xs:appinfo/ebl:CallInfo/ebl:AllCalls) and (xs:annotation/xs:appinfo/ebl:CallInfo/ebl:RequiredInput/text()="Yes" or xs:annotation/xs:appinfo/ebl:CallInfo/ebl:RequiredInput/text()="Conditionally")]')
但我需要添加一個進一步的參數,它與元素無關,而是與他的祖先有關:
假設元素name="ItemID"
我們需要添加到查詢中and element:parent:parent:parent:parent[@name="'.$API.'Type"]
因為我們有這個定義:
<xs:complexType name="AddDisputeRequestType">
<xs:annotation>
<xs:documentation>
Enables a buyer and seller in an order relationship to
send messages to each other's My Messages Inboxes.
</xs:documentation>
<xs:appinfo>
<RelatedCalls>
AddMemberMessagesAAQToBidder, AddMemberMessageRTQ
</RelatedCalls>
</xs:appinfo>
</xs:annotation>
<xs:complexContent>
<xs:extension base="ns:AbstractRequestType">
<xs:sequence>
<xs:element name="ItemID" type="ns:ItemIDType" minOccurs="0">
...
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
但不知道如何實現這一點:有人可以提出解決方案嗎
PS:有沒有更簡單的方法來檢查RequiredInput中的“Yes|Conditionally”
要訪問某個節點的祖先,您可以使用如下表達式:
//xs:element[ancestor::*[@name="AddDisputeRequestType"]]
這個表達式使用 xpath 祖先軸將選擇所有(和任何)滿足關於name
屬性的謂詞的xs:element
祖先xs:element
。 您可能想用一些更具體的元素名稱替換星號。
在這里可以找到一些關於axes
東西https://developer.mozilla.org/en-US/docs/Web/XPath/Axes和這里https://www.w3.org/TR/xpath-10/#軸
請注意,如果多個元素與表達式匹配,則可能需要額外小心。 這是一個關於http://xsltransform.net/gVAjbTj的簡短示例
更新:
是否有類似或包含操作數
我認為您可能會使用 xpath 函數contains
,例如:
//*[contains(name(), 'target')]
什么會選擇名稱中包含“目標”子字符串的所有元素。
這個構造幾乎可以用來檢查文本內容和屬性名稱,我已經更新了一個小提琴,你可能想檢查它的樣本並進一步擺弄: http : //xsltransform.net/gVAjbTj/2 。
當然,您可以自由組合執行任何特定任務所需的任何內容,例如“查找具有該名稱的所有元素,這些元素具有一些具有該名稱的后代或具有名為what的屬性的任何后代”。
希望這可以幫助 )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.