2017-06-22 19 views
0

Je dois sauvegarder la balise <![CDATA[]]> lorsque j'analyse un document XML.SimpleXML: gérer la présence de balises CDATA dans la valeur de nœud

Par exemple, j'ai noeud:

<Dest><![CDATA[some text...]]></Dest> 

Dans le fichier xml peut être présent sans nœuds CDATA.

Puis-je traiter tous les nœuds en boucle:

$dom = simplexml_load_file($path); 
foreach($dom->children() as $child) { 
$nodeValue = (string) $child; 
} 

En conséquence, quand je processus noeud dans l'exemple ci-dessus - $nodeValue = some text...

Mais j'ai besoin $nodeValue = <![CDATA[some text...]]>

Il est un moyen de le faire?

exemple du fichier:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Root> 
    <Params> 
    <param>text</param> 
    <anotherParam>text</anotherParam> 
    </Params> 
    <Content> 
    <String> 
     <Source>some another text</Source> 
     <Dest>some another text 2</Dest> 
    </String> 
    <String> 
     <Source>some another text 3</Source> 
     <Dest><![CDATA[some text...]]></Dest> 
    </String> 
    </Content> 
</Root> 
+0

Pouvez-vous donner un exemple de fichier XML? –

Répondre

0

En ce qui concerne un Parser comme SimpleXML est concerné, le <![CDATA[ ne fait pas partie du contenu textuel de l'élément XML, il fait juste partie de la sérialisation de ce contenu. Une confusion similaire est discuté ici: PHP, SimpleXML, decoding entities in CDATA

Ce que vous devez regarder est le « XML intérieur » de cet élément, qui est difficile à SimpleXML (->asXML() vous donnera le « XML externe », par exemple <Dest><![CDATA[some text...]]></Dest>).

Votre meilleur pari est d'utiliser the DOM qui vous donne plus accès à la structure détaillée du document, plutôt que d'essayer de vous donner le contenu , donc établit une distinction « nœuds de texte » et « nœuds CDATA ». Cependant, il vaut la peine de vérifier que vous en avez réellement besoin, car pour 99,9% des cas d'utilisation, vous ne devriez pas vous préoccuper de savoir si quelqu'un vous a envoyé <foo>bar &amp; baz</foo> ou <foo><![CDATA[bar & baz]]></foo>, puisqu'ils représentent par définition la même chaîne.

0

Si vous voulez ajouter CDATA à tous éléments qui ne l'a pas, vous pouvez le faire:

$dom = simplexml_load_file($path); 
foreach($dom->children() as $child) { 
    if(strpos((string) $child,'CDATA')){ 
     $nodeValue = (string) $child) 
    } 
    else { 
     $nodeValue = "<![CDATA[".((string) $child)."]]>"; 
    } 
} 

avec que vous aurez $nodeValue = '<![CDATA[some text...]]>'

si vous voulez avoir juste l'élément où il y a CDATA vous pouvez le faire:

$dom = simplexml_load_file($path); 
foreach($dom->children() as $child) { 
    if(strpos((string) $child,'CDATA')){ 
     $nodeValue = (string) $child; 
    } 
} 

avec que vous aurez $nodeValue = '<![CDATA[some text...]]>'

si vous voulez que l'élément sans CDATA et l'ajouter, vous pouvez le faire:

$dom = simplexml_load_file($path); 
foreach($dom->children() as $child) { 
    if(!strpos((string) $child,'CDATA')){ 
     $notValue ="<![CDATA[".((string) $child)."]]>"; 
    } 
} 

avec que vous devrez fournir $nodeValue = '<![CDATA[some another text 3]]>'

+0

Dans le fichier XML peut être présents nœuds sans CDATA –

+0

Comment savez-vous qui doit avoir CDATA et que ce n'est pas? –

+0

@AndrewAndrew Oh, vous avez un fichier xml où certains de la valeur sont '' et avec votre algo il supprime le CDATA? –