Comment puis-je échapper texte d'un document XML en Perl?
Quelqu'un sait de toute module Perl pour échapper texte dans un document XML?
Je suis de produire un document XML qui contient le texte entré par l'utilisateur. Je veux gérer correctement le texte de sorte que le XML est bien formé.
Quel genre de "s'échapper" faites-vous allusion?
Êtes-vous essayer de créer de sortie XML à la main?
Êtes-vous essayer de créer de sortie XML à la main?
OriginalL'auteur coldeq | 2009-07-16
Vous devez vous connecter pour publier un commentaire.
Personnellement, je préfère XML::LibXML - Perl de liaison pour libxml. L'un des avantages - il utilise l'un des plus rapides de traitement XML disponibles de la bibliothèque. Voici un exemple de création de nœud de texte:
Et, jamais, jamais créer XML à la main. Ça va être mauvais pour votre santé, lorsque les gens découvrent ce que vous avez fait.
J'ai accepté cette réponse n'est pas pour le XML::LibXML recommandation (j'ai utilisé XML::Écrivain), mais pour souligner que ce n'est pas une bonne pratique pour créer XML à la main.
Note XML::LibXML a non-dépendances perl et ne pourrait pas facilement installer sur votre plate-forme.
il vous manque des
$doc->setDocumentElement($element);
si vous souhaitez obtenir tout deOriginalL'auteur zakovyrya
Je ne suis pas sûr pourquoi vous avez besoin pour échapper à un texte qui est dans un fichier XML. Si votre fichier contient:
Le fichier est pas un fichier XML en dépit de la prolifération de crochets. Un fichier XML contient des données valides qui signifie quelque chose comme ceci:
ou
Donc, soit:
Vous ne demandez pas pour échapper à des données dans un fichier XML. Au contraire, vous voulez comprendre comment mettre des données de caractère dans un fichier XML de sorte que le fichier résultant est valide XML; ou
Vous avez quelques données dans un fichier XML qui doit être échappés une autre raison.
Soins à élaborer?
Ma question serait #1. Je ne savais pas que ma question n'était pas claire. Je vais mettre à jour la question à clarifier.
ici, mon cas est que je suis en train de monter un format XML dans un autre SAVON et le savon analyseur avez le problème de l'analyse du message encapsulé.
Inutile de non-réponse. Oui, la question de départ n'était pas très clair, mais il était encore facile de deviner, ou vous pourriez avoir demandé des éclaircissements. Je understnad votre point, mais il serait mieux si c'était avec une réponse utile (comme la plupart des autres réponses sur cette page).
OriginalL'auteur Sinan Ünür
De XML::Simple escape_value pourrait également être utilisée, mais l'utilisation de XML::Simple n'est pas recommandé pour de nouveaux programmes. Voir ce post 17436965.
Un manuel d'échappement peut être fait en utilisant les regex (copié à partir de escape_value):
a.txt = " a&b "
cela ne marchera pas.OriginalL'auteur Wadester
Utilisation XML::Code.
De CPAN
XML::code escape()
Normalement, tout le contenu du nœud seront échappés lors du rendu (j'. e. symboles spéciaux tels que "& " sera remplacé par des entités correspondantes). Appel escape() avec zéro argument pour l'empêcher:
OriginalL'auteur joe
XML::les Entités:
Edit: XML::seules Entités numifies en entités HTML. Utilisation HTML::les Entités encode_entities($a) au lieu
Vous avez raison, mon erreur. Il est possible d'utiliser de l'HTML::Entités et encode_entities à la place.
OriginalL'auteur hovenko
Utilisation
XML::Générateur de
qui permet d'imprimer tout le contenu à l'intérieur de balises échappé (pas de conflit avec le balisage).
Interface agréable mais trop lent si vous écrivez des millions de lignes de code XML.
OriginalL'auteur muenalan
Après vérification de XML::Code tel que recommandé par Krish j'ai trouvé que cela peut être fait à l'aide de XML::Code
text()
fonction. E. g.,Passant '=' crée un nœud de texte qui, une fois imprimé ne contient pas de balises.
Remarque: cela ne fonctionne que pour des données de texte. Il l'habitude de correctement s'échapper attributs.
OriginalL'auteur coldeq
Bien que vous feriez mieux d'utiliser un module comme
XML::LibXML
ouXML::Code
vous pouvez rassembler des données textuelles dans une section CDATA. Vous devez seulement prendre soin de ne pas mettre]]>
en elle (cette séquence est également rejetée à l'extérieur de des sections CDATA!):Que les bonus de votre code est plus perlish obscurci! 🙂
OriginalL'auteur Jakob
Pour les programmes qui ont besoin de traiter chaque cas particulier, par tous les moyens d'utiliser une bibliothèque officielle pour cette tâche. Cependant, théoriquement, il y a seulement 5 caractères qui ont besoin d'échapper à en XML.
Donc, pour un compromis que vous ne voulez pas tirer dans une bibliothèque, le perl suivant l'expression devrait suffire:
OriginalL'auteur Raman