Как управлять поведением XML-сериализации на xsi: nill =

StackOverflow https://stackoverflow.com/questions/658769

  •  20-08-2019
  •  | 
  •  

Вопрос

Я работаю над веб-сервисом для обмена данными между двумя ERP-системами. Первый ERP вызывает веб-сервис, который сериализует объект данных и отправляет его второму ERP.

Объект данных выглядит следующим образом:

    <xs:complexType name="Parent">
        <xs:sequence>
            <xs:element ref="ta:ReceiptLine" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Child">
        <xs:sequence>
            ...
            <xs:element name="SerialNo" type="xs:string" nillable="true" minOccurs="0"/>
            <xs:element name="Quantity" type="xs:int" nillable="false"/>
            ...
        </xs:sequence>
    </xs:complexType>
    ...
    <xs:element name="Child" type="ta:Child" nillable="true"/>

Классы, сгенерированные XSD:

[System.Serializable]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://FSM4TA/DataObjects/")]
    [System.Xml.Serialization.XmlRootAttribute(Namespace="http://FSM4TA/DataObjects/", IsNullable=false)]
public partial class Parent {
    private Child[] child;

    [System.Xml.Serialization.XmlElementAttribute("Child", IsNullable=true)]
        public Child[] Child {
            get {return this.child;}
            set {this.child = value;}
}

[System.Serializable]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://FSM4TA/DataObjects/")]
    [System.Xml.Serialization.XmlRootAttribute(Namespace="http://FSM4TA/DataObjects/", IsNullable=true)]
    public partial class Child{
        private string serialNo;
        private int quantity;

        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
        public string SerialNo {
            get {return this.serialNo;}
            set {this.serialNo = value;}
        }

        public int Quantity {
            get { return this.quantity;}
            set {this.quantity = value;}
        }
}

Я сериализую свои объекты данных с помощью XmlSerializer

Проблема : (при сериализации) Каждый раз, когда дочерний объект пуст (xsi: nil = " true ") XSD генерирует весь Child структура в любом случае. И поскольку количество не может быть нульбируемым / обнуляемым, XSD записывает 0 в качестве значения ... Например:

<Parent>
  <Child xsi:nil="true">
    <SerialNo xsi:nil="true" />
    <Quantity>0</Quantity>
  </Child>
</Parent>

Я ожидал получить что-то вроде этого:

<Parent>
  </Child xsi:nil="true">
</Parent>

Вопрос : есть ли способ предотвратить синтаксический анализ XSD xsi: nil = " true " -Object ??

Есть предложения?

TIA

Это было полезно?

Решение

хорошо,

Я понял это сейчас! Вы должны пометить свойство Количество явно XttElementAttribute!

[XmlElement(IsNullable=false)]
public int Quantity {
        get { return this.quantity;}
        set {this.quantity = value;}
    }

Не знаю, почему это не было сгенерировано автоматически ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top