![](/img/trans.png)
[英]C# XML Serialization for UWP and Xamarin with xsd.exe or svcutil.exe
[英]xsd.exe generates weird C# class for XML serialization
我在.xdr文件中有一个XML模式。 这是此文件的缩短版本(仅作为示例):
<?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>
使用xsd.exe将此文件转换为XSD格式,它会生成以下文件:
<?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>
最后,我能够通过以下xsd.exe /c ANS.xsd
为XML序列化生成.cs
文件: xsd.exe /c ANS.xsd
,结果是:
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;
}
}
}
问题是xsd.exe
将模式名称的前缀添加到类名: public partial class ANSxdrShipment
,其中public partial class ANSxdrShipment
只是Shipment
。 序列化后,它会导致错误的标记名称:
<?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>
我可以做手动更正,但是当存在嵌入的ElementTypes时问题似乎会聚合。 它会产生超长的名称,尤其是在复杂的模式中,例如:
OpenShipmentsxdrOpenShipmentsOpenShipmentShipmentReturnNotificationDetailsReturnNotificationNotificationEMailAddress
您是否序列化部分节点。 如果你从根节点序列化,你应该得到
<?xml version="1.0" encoding="utf-8"?>
<ANSxdr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Shipment>
<TrackingNumber>PN-34-23414</TrackingNumber>
</Shipment>
</ANSxdr>
看起来好像只序列化Shipment对象。 它没有标记任何属性,因此类名用作元素名称。 虽然ANSxdr.Items使用XmlElementAttribute进行修饰,它将为您提供“Shipment”元素。
编辑 :BTW,有几种替代XSD工具:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.