Frage

Beim Laden von XML in ein XmlDocument, d.h.

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

Gibt es eine Möglichkeit, den Prozess daran zu hindern, Entitäten zu ersetzen?Ich habe ein seltsames Problem, bei dem ein TM-Symbol (gespeichert als Entität #8482) in der XML-Datei in das TM-Zeichen konvertiert wird.Meiner Meinung nach sollte dies nicht passieren, da das XML-Dokument die Kodierung ISO-8859-1 hat (die nicht über das TM-Symbol verfügt).

Danke

War es hilfreich?

Lösung

Dies ist ein Standard Mißverständnis des XML-Toolset. Die ganze Sache mit „& # x“, ist eine syntaktische Funktion entwickelt, um mit Zeichenkodierungen zu bewältigen. Ihr XmlDocument ist kein Strom von Zeichen - es von Zeichencodierung Probleme befreit wurde - anstatt sie enthält ein abstraktes Modell des Typs XML-Daten. Wörter hierfür sind DOM und InfoSet, ich bin nicht sicher genau, was genau ist.

Die „& # x“ gubbins wird in diesem Modell nicht existieren, weil die ganze Frage irrelevant ist, werden sie zurückkehren - gegebenenfalls -., Wenn Sie das Info-Set zurück in einen Zeichenstrom in einiger spezifischen Codierung umwandeln

Dieses Mißverständnis ausreichend verbreitet es in der wissenschaftlichen Literatur gemacht zu haben als Teil einer Sammlung von ähnlichen Macken. Werfen Sie einen Blick auf "Xml Fever" an diesem Ort: http://doi.acm.org/10.1145/ 1364782.1364795

Andere Tipps

An was schreibst du es?Ein TextWriter?ein Strom?Was?

Im Folgenden bleibt die Entität erhalten (naja, sie wird durch das Hex-Äquivalent ersetzt) ​​– aber wenn Sie dasselbe mit einem StringWriter machen, erkennt dieser den Unicode und verwendet diesen stattdessen:

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

Ausgänge:

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

Ich bekenne, die Dinge ein wenig verwirrend mit XML-Dokumenten und Kodierungen bekommen, aber ich würde hoffen, dass es angemessen eingestellt würde erhalten, wenn Sie es noch einmal speichern, wenn Sie immer noch mit ISO-8859-1 - aber dass, wenn Sie speichern mit UTF-8, wäre es nicht brauchen. In gewisser Weise logisch das Dokument enthält wirklich das Symbol eher die Entity-Referenz - letzteres ist nur eine Codierung Angelegenheit. (Ich denke laut hier -. Nehmen Sie bitte nicht diese als maßgebliche Informationen)

Was tun Sie mit dem Dokument nach dem Laden?

I beleive if you enclose the entity contents in the CDATA section it should leave it all alone e.g.

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

Entity references are not encoding specific. According to the W3C XML 1.0 Recommendation:

If the character reference begins with "&#x", the digits and letters up to the terminating ; provide a hexadecimal representation of the character's code point in ISO/IEC 10646.

The &#xxxx; entities are considered to be the character they represent. All XML is converted to unicode on reading and any such entities are removed in favor of the unicode character they represent. This includes any occurance for them in unicode source such as the string passed to LoadXML.

Similarly on writing any character that cannot be represented by the stream being written to is converted to a &#xxxx; entity. There is little point trying to preserve them.

A common mistake is expect to get a String from a DOM by some means that uses an encoding other then unicode. That just doesn't happen regardless of what the

Thanks for all of the help.

I've fixed my problem by writing a HtmlEncode function which actually replaces all of the characters before it spits them out to the webpage (instead of relying on the somewhat broken HtmlEncode() .NET function which only seems to encode a small subset of the characters necessary)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top