我正在与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
+ "'])"