2016-02-02 59 views
2

我正在與this XML合作。這是來自代碼中API響應的字符串,但我將其放在那裏以便於查看。如何使用XPath執行WHERE語句?

您會看到它有一個<TransactionArray>節點,其中有多個<Transaction>節點。現在我正在執行此操作,以便從LAST節點中獲取<TransactionID>值,而不管有多少。

$DOM = new DOMDocument(); 
$DOM->loadXML($string); 
$XPath = new DOMXPath($DOM); 
$XPath->registerNamespace("ns","urn:ebay:apis:eBLBaseComponents"); 

$eBayTransIDs = $XPath->query("/ns:GetItemTransactionsResponse/ns:TransactionArray/ns:Transaction/ns:TransactionID/text()"); 
$eBayTransIDsLength = $eBayTransIDs->length; 

if($eBayTransIDsLength > 0) 
    $eBayTransID = $eBayTransIDs->item($eBayTransIDsLength - 1)->data; 
else 
    $eBayTransID = ''; 

可正常工作,在大多數情況下將是最近的訂單,但它並不是完美的邏輯,並可能導致一個問題,如果兩個人購買在同一時間。我需要更精確。

<Transaction>節點內部,您將看到/ExternalTransaction/ExternalTransactionID,並且我的代碼中可以使用該值。不過,我無法弄清楚如何在XPath中指定它。

基本上,我需要的是「搶<Transaction>節點,在/ExternalTransaction/ExternalTransactionID = $txn_id"

回答

3

第一,二,一般注意事項:

  • WHERE條款大致映射到謂詞中[]
  • 要注入將一個外部變量值寫入XPath中,可以將它從單獨的字符串連接在一起構成它

接着然後,以選擇Transaction元件WHERE ExternalTransaction/ExternalTransactionID = $txn_id,使用字符串的級聯,以形成一個XPath表達式如下:

"//Transaction[ExternalTransaction/ExternalTransactionID = '" + $txn_id + "']" 

更新添加命名空間前綴和的選擇字符串值選中ExternalTransactionID

"string(//ns:Transaction[ns:ExternalTransaction/ns:ExternalTransactionID = '" 
     + $txn_id 
     + "'])" 
+0

感謝一堆! –