2008-11-03 5 views
3

Je construis un document XML avec l'extension SimpleXML de PHP, et je suis l'ajout d'un jeton au fichier:Désactiver les balises à fermeture automatique dans SimpleXML pour PHP?

$doc->addChild('myToken'); 

Cela génère (ce que je sais que) un dispositif de fermeture ou une étiquette unique:

<myToken/> 

Cependant, le vieillissement service web je communique avec trébuche sur tout balises de fin, donc je dois avoir une ouverture séparée et balise de fermeture:

<myToken></myToken> 

La question est, comment puis-je faire cela, en dehors de l'exécution du code XML généré à travers un preg_replace?

Répondre

4

De la documentation à SimpleXMLElement->__construct et LibXML Predefined Constants, je pense que cela devrait fonctionner:

<?php 
$sxe = new SimpleXMLElement($someData, LIBXML_NOEMPTYTAG); 

// some processing here 

$out = $sxe->asXML(); 
?> 

Essayez cela et voir si cela fonctionne. Sinon, j'ai peur, c'est preg_replace-land.

+0

Ou juste le codage à la main. –

1

Pour l'instant, il n'est pas possible d'éviter les étiquettes à fermeture automatique avec LibXML. Une de la solution proposée par @Piskvor ne fonctionnera pas:

LIBXML_NOEMPTYTAG ne fonctionne pas avec SimpleXML, comme here mentionné:

This option is currently just available in the DOMDocument::save and DOMDocument::saveXML functions. 

Une solution pour cela est d'utiliser la réponse de this question

+0

Cela semble être une réponse à la réponse existante, pas une réponse à la question, donc devrait être ajouté en tant que commentaire sous cette réponse. – IMSoP

+0

Salut à tous, mieux maintenant? –

1

Si vous définissez la valeur sur quelque chose de vide (c'est-à-dire null, chaîne vide), il utilisera des parenthèses ouvertes/fermées.

$tag = '<SomeTagName/>'; 

echo "Tag: '$tag'\n\n"; 

$x = new SimpleXMLElement($tag); 
echo "Autoclosed: {$x->asXML()}\n"; 

$x = new SimpleXMLElement($tag); 
$x[0] = null; 
echo "Null: {$x->asXML()}\n"; 

$x = new SimpleXMLElement($tag); 
$x[0] = ''; 
echo "Empty: {$x->asXML()}\n"; 

Voir par exemple: http://sandbox.onlinephpfunctions.com/code/10642a84dca5a50eba882a347f152fc480bc47b5

0

Peut-être pas la meilleure solution mais nous avons eu même problème et résolu à l'aide pre_replace changer toutes les balises de fermeture automatique à pleine forme ...

$xml_reader = new XMLReader; 
$xml_reader->open($xml_file); 

$data = preg_replace('/\<(\w+)\s*\/\s*\>/i', '<$1></$1>', $xml_reader->readOuterXML()); 
Questions connexes