2012-09-05 85 views
6

我正在使用連接到基於遠程XML的API的PHP和XPath。來自服務器的示例響應如下所示。如何使用XPath檢查是否存在<Success />節點

<OTA_PingRS> 
     <Success /> 
     <EchoData>This is some test data</EchoData> 
    </OTA_PingRS> 

你可以看到有沒有開始標記<Success>讓我怎麼搜索的<Success />使用XPath的所有腦幹?

感謝 西蒙

+1

正常的方式,你嘗試了什麼? – Musa

回答

7

<Success />元件爲empty element,這意味着它沒有價值。它是開始和結束標記。

您可以test for existence of nodes with the XPath function boolean()

布爾函數將其參數轉換爲布爾如下:如果,如果它是唯一沒有正面或負面的

  • 一些是真正的零也不NaN的
  • 一個節點集是真的當且僅當它是非空的時
  • 一個字符串是真當且僅當它的長度非零時
  • 比四種基本類型以外的其他類型的對象轉換爲一個布爾值的方式,依賴於這種類型的

要做到這一點與DOMXPath您需要使用DOMXPath::evaluate()方法,因爲它會返回一個類型化的結果,在這種情況下,boolean

$xml = <<< XML 
<OTA_PingRS> 
    <Success /> 
    <EchoData>This is some test data</EchoData> 
</OTA_PingRS> 
XML; 

$dom = new DOMDocument; 
$dom->loadXml($xml); 

$xpath = new DOMXPath($dom); 
$successNodeExists = $xpath->evaluate('boolean(/OTA_PingRS/Success)'); 

var_dump($successNodeExists); // true 

demo


當然,你也可以只查詢/OTA_PingRS/Success,看看是否有結果返回DOMNodeList

$xml = <<< XML 
<OTA_PingRS> 
    <Success /> 
    <EchoData>This is some test data</EchoData> 
</OTA_PingRS> 
XML; 

$dom = new DOMDocument; 
$dom->loadXml($xml); 

$xpath = new DOMXPath($dom); 
$successNodeList = $xpath->evaluate('/OTA_PingRS/Success'); 

var_dump($successNodeList->length); 

demo


您還可以使用SimpleXML

$xml = <<< XML 
<OTA_PingRS> 
    <Success /> 
    <EchoData>This is some test data</EchoData> 
</OTA_PingRS> 
XML; 

$nodeCount = count(simplexml_load_string($xml)->xpath('/OTA_PingRS/Success')); 

var_dump($nodeCount); // 1 
+0

謝謝您的詳細回覆。非常感激。 – PrestonDocks

2

語法:

<Success /> 

exactly equivalent

<Success></Success> 

爲了測試<Success />存在,您只需使用這樣的路徑:

//OTA_PingRS/Success[1] 

您現在可以測試用友結果爲空。如果是,則<Success />元素不存在。

+0

感謝您的回覆,這有助於我更好地理解xpath和simplexml如何處理XML數據。 – PrestonDocks

0

使用函數來檢查要檢查存在的xpath的布爾值。

相關問題