Umgang mit ungültigen XML-Hexadezimalzeichen

8

Ich versuche, ein XML-Dokument über die Leitung zu senden, bekomme aber die folgende Ausnahme:

%Vor%

Ich habe keine Kontrolle darüber, was ich zu senden versuche, weil die Zeichenfolge aus einer E-Mail stammt. Wie kann ich meine Zeichenfolge so codieren, dass sie gültige XML ist, während die ungültigen Zeichen beibehalten werden?

Ich möchte die ursprünglichen Charaktere auf die eine oder andere Weise behalten.

    
gcso 17.11.2011, 16:31
quelle

7 Antworten

12
%Vor%

ist eine Möglichkeit, dies zu tun

    
parapura rajkumar 17.11.2011, 16:35
quelle
18

Der folgende Code entfernt ungültige XML-Zeichen aus einer Zeichenfolge und gibt eine neue Zeichenfolge ohne sie zurück:

%Vor%     
mathifonseca 14.01.2013 16:54
quelle
6

Die folgende Lösung entfernt alle ungültigen XML-Zeichen, aber ich denke dabei so performant wie möglich, und insbesondere nicht weist sie sowohl einen neuen StringBuilder als auch einen neuen StringBuilder zu string, es sei denn, es wurde bereits festgestellt, dass die Zeichenfolge ungültige Zeichen enthält. Der Hotspot ist also nur eine einzige for-Schleife für die Zeichen, wobei die Überprüfung oft nicht mehr als zwei Größer-als-Kleiner-Vergleiche für jedes Zeichen dauert. Wenn keine gefunden werden, wird einfach die ursprüngliche Zeichenfolge zurückgegeben. Dies ist besonders hilfreich, wenn die große Mehrheit der Strings gerade in Ordnung ist, es ist schön, diese so schnell wie möglich ein- und auszugeben (ohne unnötige Zuteilungen usw.).

- Aktualisierung -

Siehe unten, wie man auch direkt ein XElement mit diesen ungültigen Zeichen schreiben kann, obwohl es diesen Code verwendet -

Ein Teil dieses Codes wurde von Mr. Tom Bogles Lösung hier beeinflusst . Siehe dazu auch die hilfreichen Informationen im Beitrag von superlogisch . Alle diese Objekte instanzieren jedoch immer einen neuen StringBuilder und eine neue Zeichenfolge.

VERWENDUNG:

%Vor%

TEST:

%Vor%

// --- CODE --- (Ich habe diese Methoden in einer statischen Utility-Klasse namens XML)

%Vor%

======== ================

Schreiben Sie XElement.ToString direkt

======== ================

Erstens, die Verwendung dieser Erweiterungsmethode:

%Vor%

- Voller Test -

%Vor%

--- Code ---

%Vor%

- dies verwendet den folgenden XmlTextWriter -

%Vor%     
Nicholas Petersen 02.07.2015 22:40
quelle
4

Ich bin am empfangenden Ende von @ parapurarajkumars Lösung, wo die ungültigen Zeichen korrekt in XmlDocument geladen werden, aber XmlWriter bricht, wenn ich versuche, die Ausgabe zu speichern.

Mein Kontext

Ich schaue auf Elmah Exception / Fehler Logs von der Website. Elmah gibt den Zustand des Servers zum Zeitpunkt der Ausnahme in Form eines großen XML-Dokuments zurück. Für unsere Reporting-Engine drucke ich die XML-Datei mit XmlWriter .

Während einer Website-Attacke habe ich festgestellt, dass einige xmls nicht geparst wurden und diese '.', hexadecimal value 0x00, is an invalid character. -Ausnahme erhalten haben.

NON-RESOLUTION: Ich habe das Dokument in ein byte[] konvertiert und es von 0x00 bereinigt, aber es wurde kein gefunden.

Als ich das XML-Dokument gescannt habe, habe ich folgendes gefunden:

%Vor%

Da wurde das Null-Byte als HTML-Entität � !!! codiert.

AUFLÖSUNG: Um die Codierung zu korrigieren, ersetzte ich den � -Wert, bevor er in mein XmlDocument geladen wurde, da das Laden das Null-Byte erzeugt und es schwierig sein wird, es zu bereinigen das Objekt. Hier ist mein gesamter Prozess:

%Vor%

LERNEN gelernt: bereinigen Sie für illegale Bytes mit der zugehörigen HTML-Entität, wenn Ihre eingehenden Daten HTML-Code bei der Eingabe ist.

    
sonjz 24.10.2013 17:36
quelle
4

Arbeit für mich:

%Vor%     
lucas teles 01.10.2015 13:34
quelle
0

Kann die Zeichenfolge nicht mit gereinigt werden:

%Vor%

?

    
Sandy 16.04.2015 07:03
quelle
0

Eine weitere Möglichkeit zum Entfernen fehlerhafter XML-Zeichen in C # mithilfe von XmlConvert.IsXmlChar-Methode (verfügbar seit .NET Framework 4.0)

%Vor%

.Net Geige - Ссылка

Das senkrechte Tabulatorsymbol (\ v) ist beispielsweise für XML nicht gültig, es ist gültiges UTF-8, aber kein gültiges XML 1.0, und selbst viele Bibliotheken (einschließlich libxml2) vermissen es und geben im Hintergrund ungültiges XML aus.

    
Alex Vazhev 20.02.2018 20:00
quelle

Tags und Links