我正在使用这个XML。 它是来自我代码中 API 响应的字符串,但我把它放在那里以便于查看。
您将看到它有一个<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"
首先,两个一般注意事项:
-
WHERE
子句大致映射到[
和]
中的谓词。 - 若要将外部变量值注入到 XPath 中,可以从连接在一起的单独字符串构造它。
接下来,要选择Transaction
元素 WHERE ExternalTransaction/ExternalTransactionID = $txn_id
,请使用字符串串联形成 XPath 表达式,如下所示:
"//Transaction[ExternalTransaction/ExternalTransactionID = '" + $txn_id + "']"
更新以添加命名空间前缀并选择所选ExternalTransactionID
的字符串值:
"string(//ns:Transaction[ns:ExternalTransaction/ns:ExternalTransactionID = '"
+ $txn_id
+ "'])"