簡體   English   中英

PHP 7 DomDocument xpath 查詢父參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM