Question

Lors du chargement de XML dans un document XmlDocument, c'est-à-dire.

XmlDocument document = new XmlDocument();
document.LoadXml(xmlData);

Y a-t-il un moyen d'empêcher le processus de remplacer des entités? J'ai un problème étrange dans lequel un symbole de MT (stocké sous le numéro d'entité # 8482) dans le xml est converti en caractère TM. En ce qui me concerne, cela ne devrait pas se produire car le document XML a le codage ISO-8859-1 (qui n'a pas le symbole TM)

Merci

Était-ce utile?

La solution

Il s'agit d'une incompréhension standard de l'ensemble d'outils XML. L'ensemble de l'activité avec "& x; # x" est une fonctionnalité syntaxique conçue pour gérer les codages de caractères. Votre document XmlDocument n'est pas un flux de caractères - il n'a plus de problèmes de codage de caractères - il contient plutôt un modèle abstrait de données de type XML. Les mots pour cela incluent DOM et InfoSet, je ne sais pas exactement ce qui est exact.

Le " & amp; # x " Les gubbins n'existeront pas dans ce modèle car toute la question est sans importance, elle retournera - le cas échéant - lorsque vous transformerez le jeu d'informations en flux de caractères dans un codage spécifique.

Ce malentendu est suffisamment répandu pour en faire une littérature académique faisant partie d’un ensemble de bizarreries similaires. Jetez un coup d'œil à "Xml Fever". à cet endroit: http://doi.acm.org/10.1145/1364782.1364795

Autres conseils

À quoi écrivez-vous? Un TextWriter? un courant? quoi?

Ce qui suit conserve l'entité (enfin, il la remplace par l'équivalent hexadécimal) - mais si vous faites la même chose avec un StringWriter, il détecte l'unicode et l'utilise à la place:

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(@"<xml>&#8482;</xml>");
    using (MemoryStream ms = new MemoryStream())
    {
        XmlWriterSettings settings = new  XmlWriterSettings();
        settings.Encoding = Encoding.GetEncoding("ISO-8859-1");
        XmlWriter xw = XmlWriter.Create(ms, settings);
        doc.Save(xw);
        xw.Close();
        Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));
    }

Sorties:

    <?xml version="1.0" encoding="iso-8859-1"?><xml>&#x2122;</xml>

J'avoue que les documents et les encodages XML sont un peu déroutants, mais j'espère qu'il sera correctement défini lorsque vous enregistrez de nouveau, si vous utilisez toujours ISO-8859-1 - mais que si vous enregistrez avec UTF-8, il n'en aurait pas besoin. D'une certaine manière, logiquement, le document contient en réalité le symbole plutôt que la référence à l'entité - cette dernière n'est qu'un problème d'encodage. (Je réfléchis à voix haute. Ne prenez pas cela comme une information faisant autorité.)

Que faites-vous avec le document après l'avoir chargé?

Je pense que si vous incluez le contenu de l'entité dans la section CDATA, vous devriez le laisser seul, par exemple.

<root>
<testnode>
<![CDATA[some text &#8482;]]>
</testnode>
</root>

Les références d'entité ne sont pas spécifiques à un codage. Selon la recommandation XML 1.0 du W3C :

  

Si la référence du caractère commence par   "& amp; # x", les chiffres et les lettres allant jusqu'à   la terminaison; fournir un   représentation hexadécimale du   point de code du caractère dans ISO / IEC   10646.

Le & amp; #xxxx; les entités sont considérées comme le caractère qu'elles représentent. Tout le code XML est converti en unicode à la lecture et toutes les entités de ce type sont supprimées en faveur du caractère unicode qu'elles représentent. Cela inclut toute occurrence pour eux dans la source Unicode, telle que la chaîne transmise à LoadXML.

De même, lors de l'écriture, tout caractère qui ne peut pas être représenté par le flux en cours d'écriture est converti en un & amp; #xxxx; entité. Il ne sert à rien d'essayer de les préserver.

Une erreur courante est de s’attendre à obtenir une chaîne d’un DOM par un moyen qui utilise un codage autre que Unicode. Cela ne se produit pas, peu importe ce que le     

Merci pour votre aide.

J'ai résolu mon problème en écrivant une fonction HtmlEncode qui remplace en fait tous les caractères avant de les cracher sur la page Web (au lieu de compter sur la fonction quelque peu cassée de HtmlEncode () .NET qui semble ne coder qu'une petite sous-ensemble des caractères nécessaires)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top