xsd.exe генерирует странный класс C # для сериализации XML - PullRequest
4 голосов
/ 27 августа 2010

У меня есть XML-схема в файле .xdr.Это сокращенная версия этого файла (только для примера):

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

Наконец, я могу сгенерировать .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, где должно быть просто 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

1 Ответ

3 голосов
/ 27 августа 2010

Сериализуете ли вы частичные узлы. Если вы сериализовали с корневого узла, вы должны получить

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

Похоже, что вы сериализуете только объект отгрузки. Он не был помечен каким-либо атрибутом, поэтому имя класса используется в качестве имени элемента. В то время как ANSxdr.Items украшен XmlElementAttribute, который даст вам элемент «Отгрузка».

РЕДАКТИРОВАТЬ : Кстати, есть несколько альтернатив инструменту XSD:

  1. Пользовательский инструмент XsdCodeGen - этот парень также объяснил способ настройки генерации кода в соответствии с вашими предпочтениями
  2. Генератор образцов кода
...