Ich habe ein XSD-Schema für einen RESTful-Service. In Verbindung mit dem xsd.exe
Tool zum Generieren von C # -Code xs:date
generiert XSD den folgenden Code:
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, DataType="date")]
public System.DateTime time {
get {
return this.timeField;
}
set {
this.timeField = value;
}
}
Beim Deserialisieren von XML in Objekte XmlSerializer
scheint alles in Ordnung zu sein. Das Problem, mit dem ich konfrontiert bin, ist, dass der Dienst erwartet, dass Datumsangaben als formatiert werden YYYY-MM-DD hh:mm:ss
und der von XSD generierte Code nur zu produzieren scheint YYYY-MM-DD
.
Wenn ich XSD manuell zum xs:dateTime
Typ ändere , erzeugt der generierte C # -Code : 2010-08-20T20:07:03.915039Z
.
Wie erzwinge ich grundsätzlich die Serialisierung YYYY-MM-DD hh:mm:ss
? Gibt es etwas mit XSD zu tun oder kann ich etwas tun, um den generierten C # -Code zu ändern?
c#
.net
xml-serialization
wpfwannabe
quelle
quelle
xs:date
wird explizit so beschrieben, dass er sich auf ein Datum ohne den Zeitteil bezieht.Antworten:
In der Vergangenheit habe ich Folgendes getan, um die Serialisierung von Datum und Uhrzeit zu steuern:
Hier ist ein Beispiel:
public class SomeClass { [XmlIgnore] public DateTime SomeDate { get; set; } [XmlElement("SomeDate")] public string SomeDateString { get { return this.SomeDate.ToString("yyyy-MM-dd HH:mm:ss"); } set { this.SomeDate = DateTime.Parse(value); } } }
quelle
[XmlIgnore]
zu einer fehlerhaften Eigenschaft hinzuzufügen . Obwohl es sich um eine gute einmalige Lösung handelt, klingt es nicht gut, wenn Quell-XSD häufig mit neuen Funktionen aktualisiert wird. Ich denke, es ist vielleicht am besten, den XSD-Typ vonxs:date
bis zu ändernxs:string
und von dort zu übernehmen.[XmlElement(DataType="date")]
scheint zwar "korrekt" zu sein, formatiert das XML jedoch nicht so, wie es vom OP angefordert wurde. Ich habeyyyy-MM-dd
stattyyyy-MM-dd HH:mm:ss
. Selbst in .NET 4.0 ist die oben beschriebene Methode die allgemein akzeptierte Methode, um benutzerdefinierte Formatierungen aufDateTime
Objekte in XML anzuwenden .Verwenden Sie das
[XmlElement(DataType = "date")]
Attribut, um IhrenDateTime
Eigenschaftswert nach Bedarf zu formatieren .Von MSDN :
quelle
[XmlElement(DataType="date")]
[XmlAttribute(DataType="date")]
um als XML-Attribut anstelle eines Elements zu serialisierenDataType
vollständig ignoriertXmlSerializer
.XmlAttribute
wird ebenfalls ignoriert.Wenn Sie nur den Millisekunden-Teil löschen müssen. Beziehen auf:
So schneiden Sie Millisekunden von einer .NET DateTime ab
Und im Grunde machen Sie so etwas wie:
Ich kann bestätigen, dass dies serialisiert wird zu:
<startDate>2015-10-31T12:13:04</startDate> <endDate>2016-11-10T12:13:06</endDate>
Ich muss auch sagen, dass ich vor dem Löschen der Millisekunden Folgendes tue:
var startDateTimeToUse = ssStartDateTime.ToUniversalTime(); var endDate = DateTime.Now.ToUniversalTime(); startDateTimeToUse = DateTime.SpecifyKind(startDateTimeToUse, DateTimeKind.Unspecified); endDate = DateTime.SpecifyKind(endDate, DateTimeKind.Unspecified);
Was ich nicht weiß, ob es einen Einfluss auf die Serialisierung hat oder nicht
quelle
Ich glaube, dass die Implementierung der
IXmlSerializable
Schnittstelle einen Trick machen wird. Sie können dann steuern, wie Sie Ihr Objekt serialisieren und deserialisieren.quelle
partial
. Auf der anderen Seite verliere ich all die guten Dinge der automatischen Serialisierung von öffentlichem Eigentum, also muss ich das Rad neu erfinden. Dies wäre kein Problem, wenn die Klasse nur eine Handvoll Eigenschaften hätte. Es hat viele von ihnen und es klingt nach einer entmutigenden Aufgabe, dies aufrechtzuerhalten, da XSD Änderungen erleidet.Siehe Antworten oben, aber zum Hinzufügen: Wenn Sie nur eine Ausgabe wünschen, wenn der Wert nicht null ist (z. B. XML maxOccurs = 0), können Sie Folgendes verwenden:
private System.DateTime? someDateField; public string someDate { get { return someDateField?.ToString("MM-dd-yyyy"); } set { dobField = System.DateTime.Parse(value); } }
quelle
Ich kann eine andere Option haben. Wenn Sie Ihre DateTime einstellen, subtrahieren Sie einfach die Anzahl der Ticks von allem nach den Sekunden, wie zum Beispiel:
public DateTime Dt { get => _dt; set { _dt = value; long elapsedTicks = _dt.Ticks - new DateTime(_dt.Year, _dt.Month, _dt.Day, _dt.Hour, _dt.Minute, _dt.Second).Ticks; TimeSpan elapsedSpan = new TimeSpan(elapsedTicks); _dt = _dt.Subtract(elapsedSpan); } } private DateTime _dt = default(DateTime);
Auf diese Weise werden beim Serialisieren Ihrer DateTime (Dt) die Millisekunden nicht verwendet und Sie haben einen Wert hh: mm: ss, das hat mir zumindest gegeben. Auf diese Weise müssen Sie nichts in Ihrer XML-Definition ändern.
quelle