2008-09-23 12 views
5

Ich habe die folgende XML-Struktur:Apportieren CDATA Inhalte von XML mit PHP und 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> 

Ich möchte von einem der Artikel Tags, um die Daten zu erhalten. Um zu diesem Tag zu bekommen, verwende ich die folgende XPath:

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

dies in der Tat ein Array in Form zurückkehrt:

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

Aber wo ist die eigentliche Information (das zwischen dem Element gespeichert ist, Tags) lokalisiert? Ich muss etwas falsch machen, aber ich kann nicht herausfinden, was das sein könnte ... Wahrscheinlich etwas wirklich einfaches ... Hilfe wäre willkommen.

Antwort

15

Wenn Sie die XML-Datei laden, werden Sie die CDATA .. behandeln müssen Dieses Beispiel funktioniert:

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

Hier ist die Ausgabe:

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

Ich glaube, seine entspricht dem __toString() Methode für das Objekt, so

echo $description[0]; 

Sollte es angezeigt, oder Sie können ihn werfen;

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

Das macht das knifflig schön. Ich finde es immer noch komisch, dass die Verwendung von print_r noch keine Daten anzeigt, während es * da ist ... Danke für den Tipp! – Michiel

+0

Ich denke, es gibt ein Problem mit CDATA und SimpleXML. Wenn Sie Ihr XML-Beispiel ausprobieren und die CDATA-Wrapper entfernen, wird der Text angezeigt. Ich kann aber nicht herausfinden warum. – Till

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

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

echo($node); 

} 

dreamwerx Lösung ist besser

2

Nehmen Ein Blick auf die PHP.net-Dokumentation für "SimpleXMLElement" (http://uk.php.net/manual/en/function.simplexml-element-children.php) sieht so aus, als würde man den Knoten in eine Zeichenkette konvertieren "(string) $ value;" macht den Trick.

Wenn dies nicht gelingt, gibt es viele Beispiele auf dieser Seite, die Sie in die richtige Richtung weisen sollten!