如何使用 XPath 执行 WHERE 语句


How to do a WHERE statement with XPath?

我正在使用这个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 
        + "'])"