Fehlerbeschreibung
Beim Lesen von XML-Dokumenten in .NET mit dem XmlDocument oder dem XmlReader oder XmlTextReader kommt eine Fehlermeldung in der Form:
System.Xml.XmlException
—————-
‚‘, hexidezimaler Wert 0x1F, ist ein ungültiges Zeichen. Zeile 10, Position 13.
—————-
bei System.Xml.XmlTextReaderImpl.Throw(Exception e)
bei System.Xml.XmlTextReaderImpl.Throw(String res, String[] args)
bei System.Xml.XmlTextReaderImpl.Throw(Int32 pos, String res, String[] args)
bei System.Xml.XmlTextReaderImpl.ThrowInvalidChar(Int32 pos, Char invChar)
bei System.Xml.XmlTextReaderImpl.ParseCDataOrComment(XmlNodeType type, Int32& outStartPos, Int32& outEndPos)
bei System.Xml.XmlTextReaderImpl.ParseCDataOrComment(XmlNodeType type)
bei System.Xml.XmlTextReaderImpl.ParseElementContent()
bei System.Xml.XmlTextReaderImpl.Read()
bei System.Xml.XmlLoader.LoadNode(Boolean skipOverWhitespace)
bei System.Xml.XmlLoader.LoadDocSequence(XmlDocument parentDoc)
bei System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace)
bei System.Xml.XmlDocument.Load(XmlReader reader)
bei System.Xml.XmlDocument.LoadXml(String xml)
Bzw. in Englisch:
System.Xml.XmlException
—————–
“, hexadecimal value 0x02, is an invalid character. Line 19, position 5.
—————–
at System.Xml.XmlTextReaderImpl.Throw(Exception e)
at System.Xml.XmlTextReaderImpl.Throw(String res, String[] args)
at System.Xml.XmlTextReaderImpl.ThrowInvalidChar(Int32 pos, Char invChar)
at System.Xml.XmlTextReaderImpl.ParseCDataOrComment(XmlNodeType type, Int32& outStartPos, Int32& outEndPos)
at System.Xml.XmlTextReaderImpl.ParseCDataOrComment(XmlNodeType type)
at System.Xml.XmlTextReaderImpl.ParseElementContent()
at System.Xml.XmlTextReaderImpl.Read()
at System.Xml.XmlLoader.LoadNode(Boolean skipOverWhitespace)
at System.Xml.XmlLoader.LoadDocSequence(XmlDocument parentDoc)
at System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace)
at System.Xml.XmlDocument.Load(XmlReader reader)
at System.Xml.XmlDocument.LoadXml(String xml)
Ursache
Es ist wohl tatsächlich ein für den XML-Parser ungültiges Zeichen enthalten.
Wie das Zeichen jeweils herein kam ist mir unbekannt. Da ich den XML-Text jeweils selbst auch wegschreibe (basierend auf einem gehosteten Internet Explorer im Design-Modus), gehe ich davon aus, dass aus dem Internet Explorer ungültige Zeichen „durchrutschen“.
Eigentlich hätte ich erwartet dass beim Generieren des XML-Dokuments die .NET-XML-Routinen ungültige Zeichen bereits herausfiltern bzw. korrekt escapen.
Lösung
Auf dieser Website wird als Lösung beschrieben, die ungültigen Zeichen zu entfernen.
Mithilfe eines Regulären Ausdrucks habe ich das dann gemacht. Hier ist ein Code-Ausschnitt:
private static Regex _rx;
public static string CleanInvalidXmlCharacters(
string xml)
{
if (string.IsNullOrEmpty(xml))
{
return xml;
}
else
{
if (_rx == null)
{
// http://www.discogs.com/help/forums/topic/189304
// http://meinews.niuz.biz/regex-t248608.html?s=3e8c40fe6d48a1a36e66437f3a3ec944&
_rx = new Regex(@“[\x01-\x08\x0B\x0C\x0E-\x1F]“, RegexOptions.Compiled);
}return _rx.Replace(xml, string.Empty);
}
}
Diese Funktion rufe ich jeweils auf, bevor ich eine Zeichenfolge an die XmlDocument.Load( string xml )
-Methode übergebe.
Ich bin mir unsicher ob das die perfekte Lösung ist; sie funktioniert (übrigens in dem Programm hier) und scheint keine Seiteneffekte zu haben.
Andere Meinungen dazu?
danke für den tip. das werde ich versuchen , denn ich
habe bei manchen bestellungen haüfiger ein problem
gehabt.
Danke für den Tip, jedoch wäre das ganze als Extension noch einfacher indem man das string xml zu this string xml ändert. 🙂
Danke Uwe 🙂