analyser XML avec l'esperluette
J'ai une chaîne de caractères qui contient le XML, je veux juste d'analyser en Xelement, mais il a une esperluette. J'ai encore des problème à analyser avec HtmlDecode. Toute suggestion?
string test = " <MyXML><SubXML><XmlEntry Element="test" value="wow&" /></SubXML></MyXML>";
XElement.Parse(HttpUtility.HtmlDecode(test));
J'ai également ajouté ces méthodes pour remplacer ces personnages, mais je suis encore en train XMLException.
string encodedXml = test.Replace("&", "&").Replace("<", "<").Replace(">", ">").Replace("\"", """).Replace("'", "'");
XElement myXML = XElement.Parse(encodedXml);
t
ou Même essayé avec ceci:
string newContent= SecurityElement.Escape(test);
XElement myXML = XElement.Parse(newContent);
source d'informationauteur paradisonoir | 2009-09-24
Vous devez vous connecter pour publier un commentaire.
Idéalement, le XML est échappé correctement avant votre code de la consommation. Si c'est au-delà de votre contrôle, vous pouvez écrire une regex. N'utilisez pas la Chaîne.Remplacement de la méthode, sauf si vous êtes absolument sûr que les valeurs ne contiennent pas échappé à d'autres éléments.
Par exemple,
"wow&".Replace("&", "&")
résultats danswow&amp;
qui n'est évidemment pas souhaitable.Regex.Remplacer peut vous donner plus de contrôle pour éviter ce scénario, et peut être écrit seulement "&" les symboles qui ne font pas partie des autres personnages, tels que
<
quelque chose comme:Les travaux ci-dessus, mais il est vrai qu'il ne permet pas de couvrir la variété des caractères qui commencent par une esperluette, comme
et la liste peut se développer.Une approche plus souple serait à décoder le contenu de l'attribut value, puis de le ré-encoder. Si vous avez
value="&wow&"
le décoder les processus serait de retour"&wow&"
puis de le ré-encodage, il serait de retour"&wow&"
ce qui est souhaitable. Pour tirer cette off vous pouvez utiliser ceci:Garder à l'esprit que la regex ne vise que le contenu de l'attribut value. Si il y a d'autres domaines dans la structure XML qui souffrent de la même question, alors il peut être modifié pour correspondre à eux et de les remplacer leur contenu dans un mode similaire.
EDIT: mise à jour de la solution qui doit gérer le contenu entre les balises ainsi que quoi que ce soit entre guillemets. Assurez-vous de tester ce fond. La tentative de manipuler le XML/HTML balises avec la regex n'est pas favorable, il peut être source d'erreurs et compliqué. Votre cas est un peu particulier puisque vous avez besoin de désinfecter avant de pouvoir l'utiliser.
Votre chaîne ne contient pas de XML valide, c'est la question. Vous avez besoin de changer votre chaîne:
HtmlEncode ne fera pas l'affaire, il va probablement créer encore plus les esperluettes (par exemple, une " pourrait devenir ", qui est une entité Xml de référence, qui sont les suivantes:
Mais il peut vous obtenir des choses comme  , ce qui est bien en html, mais pas en Xml. Donc, comme tout le monde dit, corriger le code xml d'abord en veillant à n'importe quel caractère qui est PAS PARTIE DE LA MAJORATION RÉELLE DE VOTRE XML (c'est-à-dire, rien à l'INTÉRIEUR de votre xml comme une variable ou d'un texte) et qui se produit dans l'entité de référence est de traduire à leur entité correspondante (donc < deviendrait <). Si le texte qui contient le caractère illégal est le texte à l'intérieur d'un nœud xml, vous pouvez prendre la voie facile et entourent le texte avec une CDATA élément, cela ne fonctionne pas pour les attributs.
La ampersant rend le XML non valide. Ce ne peut être résolu que par une feuille de style si vous avez besoin d'écrire du code avec un autre outil ou d'un code en VB/C#/PHP/Delphi/Lisp/Etc. pour le supprimer ou de le traduire en &.
Si votre chaîne n'est pas valide XML, il ne sera pas analyser. Si elle contient une esperluette sur son propre, il n'est pas valide XML. Contrairement à HTML, XML est très stricte.
Vous devriez 'encode' plutôt que de les décoder. Mais l'appel de HttpUtility.HtmlEncode ne sera pas vous aider car il va encoder votre '<' et '>' les symboles ainsi et que votre chaîne ne sera plus un XML.
Je pense que pour ce cas, la meilleure solution serait de remplacer "& " par "& amp; " (sans espace)
Peut-être envisager d'écrire votre propre XMLDocumentScanner. C'est ce que NekoHTML fait d'avoir la capacité à ignorer les esperluettes pas utilisés comme des références d'entité.