Comment puis-je bande de caractères XML non valides à partir de chaînes de caractères en Perl?
Je suis à la recherche de ce qu'est la norme, approuvé, et robuste pour le décapage des caractères non valides à partir de chaînes avant de les écrire dans un fichier XML. Je parle ici sur les blocs de texte contenant la touche retour arrière (^H) et les caractères de saut etc.
Il a pour être une bibliothèque standard/module de fonction pour le faire, mais je ne le trouve pas.
Je suis en utilisant XML::LibXML de construire une arborescence DOM que j'ai ensuite sérialiser sur le disque.
OriginalL'auteur AndrewR | 2009-06-19
Vous devez vous connecter pour publier un commentaire.
La regex complète pour l'enlèvement de xml non valide-1.0 caractères est:
pour xml 1.1 il est:
OriginalL'auteur Heiko
Comme presque tout le monde a dit, l'utilisation d'une expression régulière. C'est honnêtement pas assez complexe pour être intéressant d'ajouter à une bibliothèque. Prétraiter votre texte avec une substitution.
Votre commentaire au sujet des sauts de ligne ci-dessus suggère que la mise en forme est d'une certaine importance pour vous, alors vous devez décider exactement ce que vous voulez de remplacer certains caractères.
La liste des caractères non valides est clairement défini dans le fichier XML spec (ici - http://www.w3.org/TR/REC-xml/#charsets - par exemple). Les caractères non autorisés sont les caractères de contrôle ASCII barre de retour chariot, saut de ligne et les tabulations. Donc, vous êtes à la recherche à 29 caractères d'expression régulière en classe de personnage. Ce n'est pas trop mauvais, sûrement.
Quelque chose comme:
devrait le faire.
Je dois avouer que je l'ai posté après que j'ai cherché sur le CPAN parce que j'étais convaincu que RE doit être en Regexp::Common quelque part!
OriginalL'auteur Nic Gibson
J'ai trouvé une solution, mais il utilise le
iconv
de commande au lieu de perl.Les solutions données ci-dessus basé sur expressions régulières ne fonctionnent pas!!, considérons l'exemple suivant:
En fait, les deux fichiers
invalid.xml
etvalid.xml
sont identiques.Le truc, c'est que la gamme "\x20-\x{D7FF}" correspond à valide les représentations de ces caractères unicode, mais pas, par exemple, l'invalide à la séquence de caractères "\x{A0}\x{A0}".
le problème est qu'il n'existe point de code, qui sont en UTF-8 valide, qui sont illégaux en XML
OriginalL'auteur Juan A. Navarro
Traduire est un beaucoup plus vite que la regex de substitution. Surtout si vous souhaitez faire supprimer des caractères. À l'aide de la salamandre est réglé:
Un test comme ceci:
donné:
Et les personnages de plus j'avais besoin de supprimer le plus rapidement tr suis en relation.
Moi aussi. J'ai pratiquement jamais en avoir besoin pour le nouveau capacités de tr. Mais si je ne se soucient pas où le personnage se produit, je vais l'utiliser à partir de maintenant, bien que, je ne suis pas sûr que probablement, je suis à exécuter dans ce cas.
Oui, c'est beaucoup plus rapide, mais 287770/s est beaucoup rapide.
OriginalL'auteur Axeman
Si vous utilisez une bibliothèque XML pour construire votre XML (par opposition à la concaténation de chaîne, modèles, etc), alors il devrait prendre soin de cela pour vous. Il est inutile de réinventer la roue.
Pour autant que je suis au courant, XML::LibXML ne rien faire de nœud de texte de contenu en dehors de la rejeter si elle contient des caractères non valides. Je serais surpris si les autres bibliothèques n'ont rien non plus.
le triton, qui est le point à l'aide d'une bibliothèque XML en premier lieu.
Bien sûr, il est, mais il a une question sur la façon de s'assurer qu'il n'a pas ce problème en veillant à ce que le contenu du texte ne contient pas de caractères non valides.
Je ne suis pas complètement sûr de ce que tu veux dire par "ce problème". Je vois XML::LibXML enlevant l' "illégale" des personnages, sauf pour nul, qu'il considère comme la fin des données 🙁
OriginalL'auteur Quentin
D'accord, ce qui semble être déjà répondu, mais ce que l'hé. Si vous souhaitez à l'auteur des documents XML, vous doit utiliser une bibliothèque XML.
Ce produit est le suivant:
Edit: je vois maintenant que vous êtes déjà à l'aide de XML::LibXML. Ceci devrait faire l'affaire.
Bien sûr, il n'. Mais la question d'origine était sur la suppression des caractères qui sera la cause de XML::LibXML à rejeter le contenu (caractères ASCII ci-dessous de la barre d'espace l'espace compris entre les caractères). Ce n'est pas tout à fait la même chose.
"use strict", c'est sympa, mais les mises en garde sont encore plus importants. N'oubliez pas de w ou "utilisez les mises en garde"!
hmmm ... viens de tomber sur ce ... XML::LibXML ne gère pas cette fonction si vous utilisez $noeud->appendText( $str ) ... mais si vous utilisez $parent->appendTextChild( 'node', $str ) ... la folie
OriginalL'auteur Leonardo Herrera
Vous pouvez utiliser une expression Régulière pour supprimer des caractères de contrôle par exemple \cH correspondra \cL ou \x08 et \x0C match retour arrière et de Saut respectivement.
OriginalL'auteur AnthonyWJones
Vous pouvez utiliser un simple regex pour rechercher et remplacer tous les caractères de contrôle dans votre bloc de texte pour les remplacer soit par un espace ou les supprimer complètement-
Ouch, ne pense pas que les sauts de ligne. triton, la réponse semble ok, alors que ce que vous essayez de faire.
OriginalL'auteur aks
Je n'ai pas fait beaucoup de travail avec XML contenant "invalide" caractères avant, mais
il me semble que vous avez deux choses complètement distinctes des problèmes ici.
Tout d'abord, il y a des personnages dans vos données que vous ne voulez pas. Vous devez décider ce que ceux qui sont, et comment vous voulez supprimer/remplacer indépendant de toute XML restrictions. Par exemple, vous pouvez avoir des choses comme
x^H_y^H_z^H_
où vous décidez que vous voulez bande à la fois l'arrière et le caractère suivant. Ou il est possible que, en fait, vous ne voulez pas régler vos données, mais qui se sentent contraints par la nécessité de représenter en XML.Mise à jour: j'ai conservé les paragraphes ci-après pour la postérité, mais elles sont fondées sur un malentendu: j'ai pensé que vous pourriez inclure tous les caractères dans les données XML, aussi longtemps que vous avez encodé correctement, mais il semble qu'il y a certains personnages qui sont carrément verboten,
même codé? XML::LibXML ces bandes (au moins la version actuelle), sauf pour le caractère nul, qu'il considère comme la fin de la chaîne, le jeter et tout ce qui suit 🙁
Seconde, vous pouvez avoir les personnages de vos données que vous avez gardé ce besoin de l'encodage en XML. Idéalement, quel que soit module XML vous utilisez voudrais faire cela pour vous, mais si ce n'est pas le cas, vous devriez être en mesure de le faire manuellement, avec quelque chose comme:
Mais c'est vraiment juste un palliatif. Utiliser un module XML; voir, par exemple,cette réponse.
OriginalL'auteur ysth
Armé d'une hache du droit sur l'utilisation de tr, mais il et newt fait une petite erreur en inversant le XML de la spécialisation juridique des personnages. http://www.w3.org/TR/REC-xml/#charsets donne
et depuis le nombre hexadécimal avant
\x20
est\x1F
(pas\x19
!) vous devez utiliserOriginalL'auteur Nic Wolff