Lire des valeurs de code autres que des caractères XML valides en Java

introduction

J'importais du XML au travail, mais à ce moment-là, l'autre partie a chargé le code de contrôle.

La méthode suivante a été utilisée pour l'importation.

Unmarshaller#unmarshal(XMLStreamReader reader, Class declaredType)

Le flux consiste à obtenir le contenu de XML sous forme de chaîne de caractères ⇒ le convertir en flux ⇒ en faire un objet.

Et j'obtiens l'erreur suivante.

Message: Un caractère XML non valide (Unicode: 0x2) a été trouvé dans le contenu de l'élément du document.

Donc, il semble que l'autre partie ne résoudra pas le problème, j'ai donc décidé de supprimer les caractères XML invalides par remplacement de chaîne.

Chaînes de caractères pouvant être utilisées en XML

Document de recommandation du W3C

Selon le site ci-dessus, les valeurs de code des caractères qui peuvent être utilisées dans XML sont les 6 modèles suivants.

① # x9 ⇒ onglet ② #xA ⇒ saut de ligne (LF) ③ #xD ⇒ saut de ligne (CR) ④ [# x20- # xD7FF] ⇒ Espace demi-largeur-Hangul ⑤ [# xE000- # xFFFD] ⇒ Caractères externes - caractères spéciaux ⑥ [# x10000- # x10FFFF] ⇒ Caractère de ligne B syllabe caractère non défini

Eh bien, en gros, vous devriez penser que les caractères que vous utilisez sont dans ④

Pour le moment, mettez une table de caractères et de valeurs de code en Unicode

Liste Unicode

Représentation en Java

Lors du remplacement en spécifiant une valeur de code en java, écrivez comme ceci. Dans ce qui suit, les espaces demi-largeur sont remplacés par des espaces. Vous pouvez utiliser Matcher ou quelque chose du genre, mais pour le moment, vous pouvez utiliser des expressions régulières avec String # replaceAll.

python


String str = "Version en chaîne XML";
str = str.replaceAll("\\u0020", "");

En Java, vous pouvez écrire un code de caractère à 2 chiffres avec "\ x00" et un code de caractère à 4 chiffres avec "\ u0000". Escape a deux contrecoups.

Si vous écrivez tout en 4 chiffres, ce sera comme ça ① #x9 ⇒ "\u0009" ② #xA ⇒ "\u000A" ③ #xD ⇒ "\u000D" ④ [#x20-#xD7FF] ⇒ "[\u0020-\uD7FF]" ⑤ [#xE000-#xFFFD] ⇒ "[\uE000-\uFFFD]"

Attendez ... il y a plus de 5 chiffres en Unicode ... Je me suis demandé comment l'exprimer. Il y avait un moyen de spécifier une valeur de code à plusieurs chiffres avec une expression régulière.

⑥ [#x10000-#x10FFFF] ⇒ "[\x{10000}-\x{10FFFF}]"

Cela semble être bien.

Combiner et refuser

Les expressions régulières peuvent être jugées par OR, alors collez-les ensemble avec un tube et refusez-les toutes.

python


String str = "Version en chaîne XML";
str = str.replaceAll("(?!\\u0009|\\u000A|\\u000D|[\\u0020-\\uD7FF]|[\\uE000-\\uFFFD]|[\\x{10000}-\\x{10FFFF}]).", "");

Avec cela, j'ai pu importer après avoir supprimé les caractères qui ne pouvaient pas être utilisés. J'étais inquiet parce que je ne pouvais pas répondre à moins que j'écrive un "." (Point) à la fin de la partie expression régulière. Pour le moment, j'ai pu supprimer les caractères qui ne pouvaient pas être utilisés.

** Ajouté le 02/08/2017 ** Comme indiqué dans les commentaires, cela peut être fait. J'ai remarqué quand on m'a dit, mais pour une raison quelconque, j'ai mal compris que je devais les séparer avec des tuyaux.

python


String str = "Version en chaîne XML";
str = str.replaceAll("[^\\u0009\\u000A\\u000D\\u0020-\\uD7FF\\uE000-\\uFFFD\\x{10000}-\\x{10FFFF}]", "");

finalement

J'ai écrit cet article parce que je n'ai pas trouvé "supprimer les caractères non inclus" lorsque j'ai recherché sur le WEB. Il existe de nombreuses façons de rechercher des lignes qui n'en contiennent pas.

Recommended Posts

Lire des valeurs de code autres que des caractères XML valides en Java
[Java] Jugement en saisissant des caractères dans le terminal
Java avec Visual Studio Code
Écrire du code de type Java8 en Java8
Arrêter de force le processus Java en spécifiant le PID dans Windows PowerShell
Devinez le code de caractère en Java
Environnement Java Spring dans vs Code
Obtenir des valeurs de carte nulles en Java
Code de création de chaîne arbitraire par Java
Tweak Markdown avec Java flexmark-java
Exemple de code pour obtenir les valeurs de type JDBC clés dans la base de données Java + H2
Carte en double triée par clé en Java
Construction de l'environnement Play Framework 2.6 (Java) avec Eclipse
Lecture de fichiers RAW, WAV, MP3 en Java
Toutes les mêmes chaînes de code de hachage en Java
[Mac] Installer Java dans Visual Studio Code
Exemple de code source pour trouver le multiple commun minimum de plusieurs valeurs en Java
Exemple de code pour obtenir les valeurs de type SQL clés dans Java + MySQL 8.0