xsd.exe generiert seltsam, C# - Klasse für die XML-Serialisierung
Ich habe ein XML-schema in .xdr-Datei. Dies ist eine verkürzte version dieser Datei(nur zum Beispiel):
<?xml version = "1.0" encoding = "WINDOWS-1252"?>
<Schema name = "ANS.xdr"
xmlns = "urn:schemas-microsoft-com:xml-data"
xmlns:dt = "urn:schemas-microsoft-com:datatypes">
<ElementType name = "Shipment" content = "eltOnly" order = "seq" model = "closed">
<element type = "TrackingNumber" minOccurs = "0" maxOccurs = "1"/>
</ElementType>
<ElementType name = "TrackingNumber" content = "textOnly" dt:type = "string" model = "closed"/>
</Schema>
Verwenden xsd.exe übersetzen Sie diese Datei in die XSD-format es poduces folgende Datei:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="ANS.xdr" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="ANS.xdr" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Shipment">
<xs:complexType>
<xs:sequence>
<xs:element name="TrackingNumber" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
Schließlich bin ich in der Lage zu generieren .cs
- Datei für die XML-Serialisierung durch:
xsd.exe /c ANS.xsd
die Ergebnisse in:
using System.Xml.Serialization;
//
//This source code was auto-generated by xsd, Version=2.0.50727.3038.
//
///<uwagi/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute("ANS.xdr", Namespace="", IsNullable=false)]
public partial class ANSxdr {
private ANSxdrShipment[] itemsField;
///<uwagi/>
[System.Xml.Serialization.XmlElementAttribute("Shipment", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public ANSxdrShipment[] Items {
get {
return this.itemsField;
}
set {
this.itemsField = value;
}
}
}
///<uwagi/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class ANSxdrShipment {
private string trackingNumberField;
///<uwagi/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string TrackingNumber {
get {
return this.trackingNumberField;
}
set {
this.trackingNumberField = value;
}
}
}
Das problem ist, dass xsd.exe
fügt Präfix schema Namen zu den Namen der Klasse: public partial class ANSxdrShipment
wo sein soll, nur Shipment
. Es führt zu falsch-tag-Namen nach der Serialisierung:
<?xml version="1.0" encoding="utf-8"?>
<ANSxdrShipment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<TrackingNumber>PN-34-23414</TrackingNumber>
</ANSxdrShipment>
Könnte ich mir manuell korrigiert, aber das problem scheint zu aggregieren, wenn es eingebettet ElementTypes. Es ergibt sich in der extra langen Namen, vor allem in Komplex-schemas, zum Beispiel:
OpenShipmentsxdrOpenShipmentsOpenShipmentShipmentReturnNotificationDetailsReturnNotificationNotificationEMailAddress
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie serialisieren teilweise Knoten. Wenn Sie serialisiert von der Wurzel-Knoten ist, sollten Sie sich
Scheint es, als ob Sie serialisieren nur Versand-Objekt. Es hat nicht markiert werden, mit einem beliebigen Attribut, so Klassenname verwendet als element-Namen. Während ANSxdr.Artikel ist verziert mit XmlElementAttribute wird, geben Sie "Sendung" - element.
BEARBEITEN: BTW, es gibt einige alternativen zu XSD-tool: