2010-08-27 55 views
4

我在.xdr文件中有一个XML模式。这是这个文件(只是举例)的简化版本:

xsd.exe为XML序列化生成奇怪的C#类

<?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格式转换它poduces以下文件:

<?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> 

最后我能生成由.cs文件XML序列化: 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其中shoud只是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

回答

3

你序列化部分节点。如果你从根节点序列化,你应该得到

<?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工具:

  1. XsdCodeGen Custom Tool - 这家伙还解释的方式来定制代码生成,按您的喜好
  2. Sample Code Generator