2016-02-02 28 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

感谢一堆! –