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
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.
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
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.
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}]", "");
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