2012-03-30 6 views
4

Ich habe eine Klasse mit XML-Attributen wie [XmlAttribute ("att")] dekoriert. Mein Ziel ist es, ein XDocument mit dem XML dieser Klasse zu erstellen. Alles funktioniert gut außer einem "0x1f" -Zeichen, das gelegentlich die Szene extern betritt. So natürlich versuche ich, es zu ersetzen, wie so:String.Replace scheint nicht Hex-Zeichen zu ersetzen

XmlSerializer serializer = new XmlSerializer(this.GetType()); 
StringWriter sw = new StringWriter(); 
serializer.Serialize(sw, this); 
string s = sw.ToString(); 
s = s.Replace((char)0x1F, ' '); 
XDocument xs = XDocument.Parse(s); 
return xs; 

Jedoch habe ich noch einen Fehler: „‘‘, hexadezimale Wert 0x1F, ist ein ungültiges Zeichen.“

Nur für eine Plausibilitätsprüfung, hier ein Screenshot: http://i.imgur.com/jZRWg.png

Irgendwelche Ideen, wo ich schief gehen könnte?

+3

Und versuchen Sie zu finden, wie '‚0x1f‘Charakter gelegentlich die Szene –

+0

@LB externally' eintritt, diese Strings mit 0x1f von einem Web-Service-Aufruf abgerufen werden, die nicht mein Code ist (dh außerhalb meine Codebasis). Auch wenn ich string.replace das anstößige Zeichen aus dem Service-Anruf heiß, scheint es immer noch zu bestehen! – b9190db9

+0

@ L.B, Danke für den Link. Ich bin sicher, dass eine akzeptierte Antwort markiert wird. Ich habe nur Internet-Zugang über ein winziges Handy-Bildschirm, so dass meine Verletzung der Konvention war nicht sofort für mich offensichtlich: P – b9190db9

Antwort

2

Sie erhalten die gleiche Antwort, wenn es als eine Entität dargestellt wird - vielleicht ist das was passiert? Sehen Sie sich s an, um sicher zu gehen.

Probe:

using System; 
using System.Xml.Linq; 

class Test 
{ 
    static void Main() 
    { 
     string xml = "<foo>&#31;</foo>"; 
     XDocument.Parse(xml); 
    } 
} 
+0

Ist Ihr Vorschlag, diese Zeile hinzuzufügen: s.Replace ("", string.Empty); Leider bekomme ich den gleichen Fehler. – b9190db9

+0

@ b9190db9: Nun, mein erster Vorschlag ist, * die Saite * zu betrachten. Setzen Sie einen Breakpoint in den Debugger oder loggen Sie ihn irgendwo ein - was immer nötig ist, um ihn genau zu betrachten. Finden Sie heraus, welche Form der schlechte Charakter nimmt ... –

+0

Ich kann einen bedingten Haltepunkt setzen, wo ich nach "0x1F" suche, und das Programm bricht erfolgreich. Dann rufe ich wie oben beschrieben string.replace auf und setze einen weiteren bedingten Haltepunkt, der ebenfalls bricht. Kopieren/Einfügen der Zeichenfolge in etwas wie Notepad ++ zeigt nicht das Zeichen, wie ich es erwarten würde. Ich habe Probleme beim Sieben dieser seltsamen Gedanken: P – b9190db9

2

Der Charakter x1F in XML 1.0 nicht legal ist. Also werden XML-Parser es ablehnen. Es ist legal in XML 1.1, vorausgesetzt, es ist in Escape-Form geschrieben &#x1f; - aber nicht jeder unterstützt XML 1.1. Das Beste ist, herauszufinden, wo dieser Charakter in das System eindringt und es an der Quelle zu stoppen.

1

Für mich gab es einige Probleme, wenn Sie versuchen, die Zeichenfolge anstelle des Zeichens zu ersetzen. Ich schlage vor, einige Testwerte mit beiden zu testen, um zu sehen, was sie auftauchen. Auch wie Sie es referenzieren, wirkt sich aus.

var a = x.IndexOf('\u001f');      // 513 
var b = x.IndexOf(Convert.ToString((byte)0x1F)); // -1 
x = x.Replace(Convert.ToChar((byte)0x1F), ' '); // Works 
x = x.Replace(Convert.ToString((byte)0x1F), " "); // Fails 

I blagged this