XML-Parsefehler abhängig vom ausführenden Rechner?

23/07/2009 - 14:08 von Marvin Massih | Report spam
Hallo,

ich deserialisiere Daten aus XML-Dateien und validiere dabei gegen ein
Schema, das ich als Ressource aus einer Assembly lade.

Auf meinem Rechner funktioniert das auch wunderbar, beim Kunden jedoch
knallt es mit exakt demselben Programm und exakt derselben Datei.

U.a. enthàlt das Schema folgende Elemente:

<xs:element name="Date" type="xs:dateTime"/>
<xs:element name="Foo" type="xs:dateTime"/>
<xs:element name="Bar" type="xs:dateTime" nillable="true" minOccurs="0">

Beim Einlesen der Datei meckert er nun, dass Zeile 24 kein gültiges
DateTime enthalte:

<Bar>2000-01-03T00:00:00</Bar>

Das sieht doch aber ok aus, und lokal geht es bei mir auch...?
Am verrücktesten aber ist, dass er erst über Zeile 24 meckert und nicht
schon über Zeile 20:

<Foo>2000-01-03T00:00:00</Foo>

Oder gar über Zeile 5:

<Date>2009-07-09T19:22:28+02:00</Date>

Woran kann das denn liegen? An den zusàtzlichen Attributen bei "Bar"?
Hier noch der komplette Stacktrace:

System.InvalidOperationException: There is an error in XML document (24,
57). > System.FormatException: String was not recognized as a valid
DateTime.
at System.DateTimeParse.ParseExactMultiple(String s, String[]
formats, DateTimeFormatInfo dtfi, DateTimeStyles style)
at System.DateTime.ParseExact(String s, String[] formats,
IFormatProvider provider, DateTimeStyles style)
at System.Xml.XmlConvert.ToDateTime(String s, String[] formats)
at System.Xml.Serialization.XmlCustomFormatter.ToDateTime(String
value, String[] formats)
at System.Xml.Serialization.XmlCustomFormatter.ToDate(String value)
at System.Xml.Serialization.XmlSerializationReader.ToDate(String value)
at
Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderDataType.Read25_NullableOfDateTime(Boolean
checkType)
at
Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderDataType.Read61_ActivityDataType(Boolean
isNullable, Boolean checkType)
at
Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderDataType.Read65_DataDeliveryType(Boolean
isNullable, Boolean checkType)
at
Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderDataType.Read68_DataType(Boolean
isNullable, Boolean checkType)
at
Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderDataType.Read69_Data()
End of inner exception stack trace
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader
xmlReader, String encodingStyle, XmlDeserializationEvents events)
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader
xmlReader, String encodingStyle)
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader
xmlReader)


Gruß
Marvin
 

Lesen sie die antworten

#1 Elmar Boye
23/07/2009 - 19:41 | Warnen spam
Hallo Marvin,

Marvin Massih schrieb:
ich deserialisiere Daten aus XML-Dateien und validiere dabei gegen ein
Schema, das ich als Ressource aus einer Assembly lade.

Auf meinem Rechner funktioniert das auch wunderbar, beim Kunden jedoch
knallt es mit exakt demselben Programm und exakt derselben Datei.



Ich vermute da passt etwas mit dem Schema
und/oder der empfangenden Klasse nicht...


U.a. enthàlt das Schema folgende Elemente:

<xs:element name="Date" type="xs:dateTime"/>
<xs:element name="Foo" type="xs:dateTime"/>
<xs:element name="Bar" type="xs:dateTime" nillable="true" minOccurs="0">



... nur so heißen sie ja vermutlich nicht ;-)
Ich habe mir jetzt kein Gegenstück gebastelt,
aber "Bar" sollte DateTime? sein.


Beim Einlesen der Datei meckert er nun, dass Zeile 24 kein gültiges
DateTime enthalte:

<Bar>2000-01-03T00:00:00</Bar>

Woran kann das denn liegen? An den zusàtzlichen Attributen bei "Bar"?
Hier noch der komplette Stacktrace:

System.InvalidOperationException: There is an error in XML document (24,
57). > System.FormatException: String was not recognized as a valid
DateTime.
at System.DateTimeParse.ParseExactMultiple(String s, String[]
formats, DateTimeFormatInfo dtfi, DateTimeStyles style)
at System.DateTime.ParseExact(String s, String[] formats,
IFormatProvider provider, DateTimeStyles style)
at System.Xml.XmlConvert.ToDateTime(String s, String[] formats)
at System.Xml.Serialization.XmlCustomFormatter.ToDateTime(String
value, String[] formats)
at System.Xml.Serialization.XmlCustomFormatter.ToDate(String value)
at System.Xml.Serialization.XmlSerializationReader.ToDate(String value)



Hier zeigt der StackTrace, das versucht wird ein Date (ohne Zeit) zu parsen,
was auf type="xs:dateTime" hinweist.

Und wenn man sich via Reflector zum CustomFormatter durchhangelt,
resultiert das in
// aus XmlCustomFormatter
string[] allDateFormats = new string[]
{
"yyyy-MM-ddzzzzzz", "yyyy-MM-dd", "yyyy-MM-ddZ", "yyyy",
"dd", "ddZ", "ddzzzzzz",
"--MM-dd", "--MM-ddZ", "--MM-ddzzzzzz", "--MM--", "--MM--Z",
"--MM--zzzzzz", "yyyy-MM", "yyyy-MMZ", "yyyy-MMzzzzzz", "yyyyzzzzzz"
};

System.Xml.XmlConvert.ToDateTime("2000-01-03T00:00:00", allDateFormats);

was schiefgeht, weil das geforderte Format nicht darunter ist.
Umgekehrt wird es es bei den anderen Datümern klappen, weil er mit Zeit parst,
wo die Liste der Formate deutlich lànger ist (spare ich mir aufzuführen).

Gruß Elmar

Ähnliche fragen