2010-09-06 24 views
8

ayrıştırılırken cdata içeriği alınıyor ben xml ayrıştırma için xpath ve ve XQuery'yi kullanılanxml dosyası

<?xml version="1.0" encoding="utf-8"?> 
<xml> 
    <events date="01-10-2009" color="0x99CC00" selected="true"> 
     <event> 
      <title>You can use HTML and CSS</title> 
      <description><![CDATA[This is the description ]]></description> 
     </event> 
    </events> 
</xml> 

bir XML dosyası var.

$xml_str = file_get_contents('xmlfile'); 
$xml = simplexml_load_string($xml_str); 
if(!empty($xml)) 
{ 
    $nodes = $xml->xpath('//xml/events'); 
} 

i düzgün başlık alıyorum, ama IAM ı iç

cevap

8

SimpleXML CDATA'da ile sorunun biraz sahiptir cdata verilerini alabilirsiniz description.How almıyor, bu yüzden kullanın:

$xml = simplexml_load_file('xmlfile', 'SimpleXMLElement', LIBXML_NOCDATA); 
if(!empty($xml)) 
{ 
    $nodes = $xml->xpath('//xml/events'); 
} 
print_r($nodes); 

Bu size verecektir:

Array 
(
    [0] => SimpleXMLElement Object 
     (
      [@attributes] => Array 
       (
        [date] => 01-10-2009 
        [color] => 0x99CC00 
        [selected] => true 
       ) 

      [event] => SimpleXMLElement Object 
       (
        [title] => You can use HTML and CSS 
        [description] => This is the description 
       ) 

     ) 

) 
+0

teşekkürler slomojo. İyi çalışıyor. – Warrior

+4

Yanlış! SimpleXML'in CDATA ile ilgili bir sorunu yoktur ve bu, sürdürülmemesi gereken kalıcı bir efsanedir. O sadece 'SimpleXML aslında bir "gerçek" PHP nesne olarak veri depolamak değil çünkü, CDATA göremiyorum print_r', sadece talep üzerine o kadar öksürür. – IMSoP

9

muhtemelen ediliyor mis CDATA print_r veya diğer "normal" PHP hata ayıklama işlevlerinden birini kullanarak eksik olduğunu düşünerek içine götürdü. Bunlar bir "gerçek" PHP nesnesi olmadığından, bir SimpleXML nesnesinin tam içeriğini göremez.

Eğer echo $nodes[0]->Description çalıştırırsanız, senin CDATA dışarı ince gelir göreceksiniz. Olan şey, PHP'nin echo'un bir dize beklediğini bilmesidir, bu yüzden bir tane için SimpleXML'i sorar; SimpleXML tüm CDATA'da dahil dize içeriği ile cevap verir.

güvenilir tam dize içeriği almak için, sadece ne istediğini (string) döküm operatörü kullanılarak bir dize, örneğin olduğunu PHP söyle $description = (string)$nodes[0]->Description.

SimpleXML nesneleri hata ayıklamak için ve bunun gibi tuhaflıklar aldanmayın, bunlardan biri gibi özel bir ayıklama işlevini kullanın: https://github.com/IMSoP/simplexml_debug

2

Bu aynı zamanda bu kodu kaldırmak ve yaşam a kılacak başka uygun bir seçenek, olabilir biraz daha kolay.

$xml = str_replace("-", "_", $xml); 
$xml = str_replace("<![CDATA[", "", $xml); 
$xml = str_replace("]]>", "", $xml);