Domanda

Quando si carica XML in un documento Xml, ad esempio

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

c'è un modo per impedire al processo di sostituire le entità? Ho uno strano problema in cui ho un simbolo TM (memorizzato come entità # 8482) nell'xml che viene convertito nel carattere TM. Per quanto mi riguarda, ciò non dovrebbe accadere in quanto il documento XML ha la codifica ISO-8859-1 (che non ha il simbolo TM)

Grazie

È stato utile?

Soluzione

Questo è un malinteso standard del set di strumenti XML. L'intera attività con " & amp; # x " ;, è una funzione sintattica progettata per far fronte alle codifiche dei caratteri. Il tuo XmlDocument non è un flusso di caratteri - è stato liberato da problemi di codifica dei caratteri - invece contiene un modello astratto di dati di tipo XML. Le parole per questo includono DOM e InfoSet, non sono sicuro esattamente quale sia accurato.

Il " & amp; # x " gubbins non esisterà in questo modello perché l'intero problema è irrilevante, tornerà - se appropriato - quando trasformerai il set di informazioni in un flusso di caratteri in una codifica specifica.

Questo equivoco è sufficientemente comune per essere entrato nella letteratura accademica come parte di una raccolta di stranezze simili. Dai un'occhiata a " Xml Fever " in questa posizione: http://doi.acm.org/10.1145/1364782.1364795

Altri suggerimenti

A cosa stai scrivendo? Un TextWriter? un flusso? che cosa?

Quanto segue mantiene l'entità (beh, la sostituisce con l'equivalente esadecimale) - ma se fai lo stesso con StringWriter rileva l'unicode e lo usa invece:

    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()));
    }

Uscite:

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

Confesso che le cose diventano un po 'confuse con i documenti e le codifiche XML, ma spero che venga impostato in modo appropriato quando lo salvi di nuovo, se stai ancora usando ISO-8859-1 - ma se salvi con UTF-8, non sarebbe necessario. In un certo senso, logicamente il documento contiene davvero il simbolo piuttosto che il riferimento all'entità: quest'ultimo è solo una questione di codifica. (Sto pensando ad alta voce qui - per favore, non prenderlo come informazione autorevole.)

Cosa stai facendo con il documento dopo averlo caricato?

Credo che se racchiudi il contenuto dell'entità nella sezione CDATA, dovrebbe lasciarlo tutto da solo, ad esempio

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

I riferimenti alle entità non sono specifici della codifica. Secondo la Raccomandazione W3C XML 1.0 :

  

Se il riferimento al carattere inizia con   " & amp; # x " ;, le cifre e le lettere fino a   la risoluzione; fornire un   rappresentazione esadecimale di   punto di codice del carattere in ISO / IEC   10646.

Il & amp; #xxxx; le entità sono considerate il carattere che rappresentano. Tutto l'XML viene convertito in Unicode in lettura e tali entità vengono rimosse a favore del carattere Unicode che rappresentano. Ciò include qualsiasi occorrenza per loro nell'origine Unicode come la stringa passata a LoadXML.

Allo stesso modo quando si scrive qualsiasi carattere che non può essere rappresentato dallo stream in cui si sta scrivendo viene convertito in & amp; #xxxx; entità. È inutile cercare di preservarli.

Si prevede che un errore comune ottenga una stringa da un DOM in qualche modo che utilizza una codifica diversa da quella unicode. Questo non succede, indipendentemente da ciò che     

Grazie per tutto l'aiuto.

Ho risolto il mio problema scrivendo una funzione HtmlEncode che in realtà sostituisce tutti i caratteri prima che li sputi sulla pagina web (invece di fare affidamento sulla funzione .NET un po 'rotta HtmlEncode () che sembra solo codificare un piccolo sottoinsieme dei caratteri necessari)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top