2008-09-23 2 views
5

Я имею следующую структуру XML:Получение CDATA содержимое из XML с помощью PHP и SimpleXML

<?xml version="1.0" ?> 
<course xml:lang="nl"> 
    <body> 
    <item id="787900813228567" view="12000" title="0x|Beschrijving" engtitle="0x|Description"><![CDATA[Dit college leert studenten hoe ze een onderzoek kunn$ 
    <item id="5453116633894965" view="12000" title="0x|Onderwijsvorm" engtitle="0x|Method of instruction"><![CDATA[instructiecollege]]></item> 
    <item id="7433550075448316" view="12000" title="0x|Toetsing" engtitle="0x|Examination"><![CDATA[Opdrachten/werkstuk]]></item> 
    <item id="015071401858970545" view="12000" title="0x|Literatuur" engtitle="0x|Required reading"><![CDATA[Wayne C. Booth, Gregory G. Colomb, Joseph M. Wi$ 
    <item id="5960589172957031" view="12000" title="0x|Uitbreiding" engtitle="0x|Expansion"><![CDATA[]]></item> 
    <item id="3610066867901779" view="12000" title="0x|Aansluiting" engtitle="0x|Place in study program"><![CDATA[]]></item> 
    <item id="19232369892482925" view="12000" title="0x|Toegangseisen" engtitle="0x|Course requirements"><![CDATA[]]></item> 
    <item id="3332396346891524" view="12000" title="0x|Doelgroep" engtitle="0x|Target audience"><![CDATA[]]></item> 
    <item id="6606851872934866" view="12000" title="0x|Aanmelden bij" engtitle="0x|Enrollment at"><![CDATA[]]></item> 
    <item id="1478643580820973" view="12000" title="0x|Informatie bij" engtitle="0x|Information at"><![CDATA[Docent]]></item> 
    <item id="9710608434763993" view="12000" title="0x|Rooster" engtitle="0x|Schedule"><![CDATA[1e semester, maandag 15.00-17.00, zaal 1175/030]]></item> 
    </body> 
</course> 

Я хочу, чтобы получить данные от одного из тегов элементов. Для того, чтобы попасть в этот тег, я использую следующий XPath:

$description = $xml->xpath("//item[@title='0x|Beschrijving']"); 

Это действительно возвращает массив в виде:

Array 
(
    [0] => SimpleXMLElement Object 
     (
      [@attributes] => Array 
       (
        [id] => 787900813228567 
        [view] => 12000 
        [title] => 0x|Beschrijving 
        [engtitle] => 0x|Description 
       ) 
     ) 
) 

Но где текущая информация (которая хранится между элементом теги)? Я, должно быть, делаю что-то не так, но я не могу понять, что это может быть ... Возможно, что-то действительно простое ... Помощь будет оценена.

ответ

15

При загрузке файла XML, вам нужно обрабатывать CDATA .. Этот пример работает:

<?php 
$xml = simplexml_load_file('file.xml', NULL, LIBXML_NOCDATA); 
$description = $xml->xpath("//item[@title='0x|Beschrijving']"); 
var_dump($description); 
?> 

Вот результат:

array(1) { 
    [0]=> 
    object(SimpleXMLElement)#2 (2) { 
    ["@attributes"]=> 
    array(4) { 
     ["id"]=> 
     string(15) "787900813228567" 
     ["view"]=> 
     string(5) "12000" 
     ["title"]=> 
     string(15) "0x|Beschrijving" 
     ["engtitle"]=> 
     string(14) "0x|Description" 
    } 
    [0]=> 
    string(41) "Dit college leert studenten hoe ze een on" 
    } 
} 
2

Я считаю его эквивалент метода __toString() на объекте, так

echo $description[0]; 

Если отобразить его, или вы можете бросить его; Решение

$str = (string) $description[0]; 
+0

Это делает сложным красиво. Мне все еще кажется странным, что использование print_r по-прежнему не показывает никаких данных, в то время как это * есть * там ... Спасибо за подсказку! – Michiel 2008-09-23 09:44:46

1
$description = $xml->xpath("//item[@title='0x|Beschrijving']"); 

while(list(, $node) = each($description)) { 

echo($node); 

} 

dreamwerx является лучше

2

Take посмотрите на документацию PHP.net для «SimpleXMLElement» (http://uk.php.net/manual/en/function.simplexml-element-children.php), похоже, что преобразование узла в строку «(строка) $ value;» делает трюк.

В противном случае на этой странице представлено множество примеров, которые должны указывать на вас в правильном направлении!

Смежные вопросы