Traiter avec XML non valide caractères hexadécimaux
Je suis en train d'envoyer un document XML sur le fil, mais la réception de l'exception suivante:
"MY LONG EMAIL STRING" was specified for the 'Body' element. ---> System.ArgumentException: '', hexadecimal value 0x02, is an invalid character.
at System.Xml.XmlUtf8RawTextWriter.InvalidXmlChar(Int32 ch, Byte* pDst, Boolean entitize)
at System.Xml.XmlUtf8RawTextWriter.WriteElementTextBlock(Char* pSrc, Char* pSrcEnd)
at System.Xml.XmlUtf8RawTextWriter.WriteString(String text)
at System.Xml.XmlUtf8RawTextWriterIndent.WriteString(String text)
at System.Xml.XmlRawWriter.WriteValue(String value)
at System.Xml.XmlWellFormedWriter.WriteValue(String value)
at Microsoft.Exchange.WebServices.Data.EwsServiceXmlWriter.WriteValue(String value, String name)
--- End of inner exception stack trace ---
Je n'ai pas de contrôle sur ce que je tente de l'envoyer, car la chaîne est recueillie à partir d'un e-mail. Comment puis-je encoder ma chaîne c'est donc valide XML tout en gardant les caractères illégaux?
J'aimerais garder les caractères d'origine d'une manière ou d'une autre.
Fournir de la chaîne (XML).
Dépend si les caractères illégaux sont des choses comme x0 que XML ne peut pas gérer du tout, ou des choses comme
Dépend si les caractères illégaux sont des choses comme x0 que XML ne peut pas gérer du tout, ou des choses comme
<
qui ont simplement besoin d'être échappé.OriginalL'auteur gcso | 2011-11-17
Vous devez vous connecter pour publier un commentaire.
est une façon de le faire
OriginalL'auteur parapura rajkumar
Le code suivant supprime XML non valide caractères à partir d'une chaîne de caractères et renvoie une nouvelle chaîne sans eux:
OriginalL'auteur mathifonseca
La solution suivante supprime tous les caractères XML non valides, mais je pense que performantly comme cela pourrait être fait, et, en particulier, il ne pas allouer une nouvelle StringBuilder ainsi que d'une nouvelle chaîne, pas moins qu'il est déjà déterminé que la chaîne de caractères non valides. Donc, le point chaud finit par être seulement un seul pour la boucle sur les personnages, avec le chèque finissant souvent pas plus de deux supérieure /inférieure numérique des comparaisons sur chaque char. Si aucun n'est trouvé, il renvoie simplement la chaîne d'origine. Ceci est particulièrement utile lorsque la grande majorité des chaînes sont juste très bien pour commencer, c'est agréable d'avoir ces dans et hors (avec pas de gaspillage d'allocations etc) aussi rapide que possible.
-- update --
Voir ci-dessous comment on peut également écrire directement un XElement qui a ces caractères non valides, même si elle utilise ce code --
Une partie de ce code a été influencé par M. Tom Bogle la solution ici. Voir aussi sur ce même thread les informations utiles dans le post de superlogical. L'ensemble de ces, toutefois, toujours instancier un nouvel objet StringBuilder et de la chaîne.
UTILISATION:
TEST:
//--- CODE --- (j'ai de ces méthodes dans la statique de la classe utilitaire appelé XML)
======== ======== ========
Écrire XElement.ToString directement
======== ======== ========
Tout d'abord, l'utilisation de cette méthode d'extension:
-- Fuller test --
--- code ---
-- il utilise les éléments suivants XmlTextWritter --
OriginalL'auteur Nicholas Petersen
Je suis sur la fin de réception de @parapurarajkumar de solution, où les caractères illégaux sont correctement chargés dans
XmlDocument
, mais la ruptureXmlWriter
quand je suis en train d'enregistrer la sortie.Mon Contexte
Je suis à la recherche d'exception/journaux d'erreur à partir du site web à l'aide de Elmah. Elmah retourne l'état du serveur au moment de l'exception, dans la forme d'un document XML. Notre moteur de reporting j'ai assez d'imprimer les XML avec
XmlWriter
.Au cours d'un site web d'attaque, j'ai remarqué que certains xmls n'étaient pas à l'analyse et a la réception de ce
'.', hexadecimal value 0x00, is an invalid character.
exception.NON-RÉSOLUTION: j'ai converti le document à un
byte[]
et désinfectés de 0x00, mais il n'en trouva aucun.Lorsque j'ai scanné le document xml, j'ai trouvé le suivant:
Il n'y avait nul octets codés comme une entité html
�
!!!RÉSOLUTION: De fixer l'encodage, j'ai remplacé le
�
valeur avant de les charger dans monXmlDocument
, car le chargement il permettra de créer de l'octet nul et il sera difficile de désinfecter de l'objet. Voici mon ensemble du processus:LEÇON APPRISE: désinfecter illégale d'octets à l'aide de l'associé en entité html, si vos données entrantes est html codé sur entrée.
OriginalL'auteur sonjz
De travail pour moi:
CheckCharacters = true
sur les paramètres a fait le tour pour moi. Merci!OriginalL'auteur lucas teles
Peut pas la chaîne être nettoyé avec de l':
?
OriginalL'auteur Sandy
Une autre façon de supprimer XML incorrecte caractères en C# avec l'aide de XmlConvert.IsXmlChar Méthode (Disponible depuis .NET Framework 4.0)
.Net Violon https://dotnetfiddle.net/v1TNus
Par exemple, la verticale symbole de tabulation (\v) n'est pas valide pour le XML, c'est UTF-8 valide, mais pas valide XML 1.0, et même de nombreuses bibliothèques (y compris les libxml2) manquer et silencieux de sortie XML non valide.
OriginalL'auteur Alex Vazhev