我正在与this 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元素,在哪里ExternalTransaction/ExternalTransactionID = $txn_id,请使用字符串串联以形成XPath表达式,如下所示:

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




更新以添加名称空间前缀并选择所选ExternalTransactionID的字符串值:

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

09-25 21:13