2015-09-21 86 views
0

我們下面的示例XML:爲什麼PHP SimpleXML children()爲空標籤返回null?

<xml> 
    <call> 
     <branchId>2</branchId> 
     <item_main_display>1</item_main_display> 
     <workstation_Id>1</workstation_Id> 
     <formatted_ticket_number>203</formatted_ticket_number> 
     <queue_letter></queue_letter> 
     <service_Id>17</service_Id> 
     <service_Name>konsultanti Queue</service_Name> 
     <isflashing>false</isflashing> 
     <workstation_Name>ServicePoint_D924</workstation_Name> 
     <callTime>1442583923157</callTime> 
     <timestamp>1442583923</timestamp> 
     <eventTime>2015-09-18T17:45:23.114+0400</eventTime> 
    </call> 
</xml> 

使用跟隨着PHP代碼,我們試圖訪問所有XML節點;

$xml=simplexml_load_file("sample.xml"); 

$xmlStr=""; 
$xmlStr.="<xml>"; 

foreach($xml->children() as $child1) 
{ 
    $xmlStr.="<". $child1->getName().">"; 
    foreach($child1->children() as $child2){ 
     $xmlStr.="<". $child2->getName() .">". $child2 ."</". $child2->getName() .">"; 
    } 
    $xmlStr.="</". $child1->getName().">"; 
} 
$xmlStr.="</xml>"; 

此代碼工作正常,但:對於標籤

<queue_letter></queue_letter>  

對於此標記$ child1->兒童()返回null;但是,如果我在標籤之間輸入空格

<queue_letter>  </queue_letter> 

或換行符或任何其他字符,則返回標籤。

這是正常的行爲嗎?我們如何返回不包含字符的子標籤?

謝謝。

+1

問題中提供的代碼適用於我:https://3v4l.org/uA6Fm(雖然整個事情可以簡化爲'$ xml-> asXML()',但我假設有一些原因需要以這種方式進行循環。) – IMSoP

+1

哦,僅供參考,''是保留名稱,所以上述XML在技術上無效。再說一次,可能只是你匿名化你的例子的方式,但如果你真的使用了這個標籤,我建議改變它以避免以後出現問題。 – IMSoP

+0

謝謝。非常有用。 –

回答

0

如果標籤之間有空格,標籤不是空的 - 他有一個文本節點,因爲它是子節點。

<queue_letter></queue_letter>相同<queue_letter />這個標籤只是沒有孩子,所以它總是返回null

+0

謝謝。 但我想訪問 標記自己並獲取其名稱。問題是 - 整個標籤爲空。 –

-1

我能夠解決這種情況如下方式:我的PHP服務器包含resin.jar 我剛剛下載最新的它的版本,並取代原來的一個。 一切正常。看看這個:Resin web server

+0

我在下調這個,因爲沒有解釋resin.jar是什麼,你在哪裏找到它,或者它與這個問題有什麼關係。 PHP組件通常不分佈在或依賴於JAR文件。 – IMSoP

+0

我編輯了答案。 –

+0

我仍然不明白這與PHP和SimpleXML有什麼關係。你使用的是[Quercus](http://www.caucho.com/resin-3.1/doc/quercus.xtp),而不是PHP的正常分佈,這是他們實現SimpleXML時的一個錯誤? – IMSoP