Игнорирование нулевого значения в XML-сериализации - PullRequest
4 голосов
/ 27 января 2012

У меня есть кусок xml, который выглядит примерно так:

  <SubscriptionProduct>
    <SubscriptionProductIdentifier>
      <SubscriptionProductIdentifierType>
        <SubscriptionProductIDType>01</SubscriptionProductIDType>
        <ID>123456</ID>
        <Value>AAAA</Value>
      </SubscriptionProductIdentifierType>
      <SubscriptionProductIdentifierType xsi:nil="true" />
    </SubscriptionProductIdentifier>
    <SubscriptionProductDescription />
  </SubscriptionProduct>

Как вы можете видеть, SubscriptionProductIdentifierType является коллекцией, и в этом случае содержит только один элемент.
Как игнорировать второй пустойitem?

Я попытался добавить xml ignore, однако он удаляет всю коллекцию, и я хочу удалить только второй элемент в коллекции, если нет данных.

[System.Xml.Serialization.XmlIgnoreAttribute()]
public SubscriptionProductIdentifierType[] SubscriptionProductIdentifier {
    get {
        return this.subscriptionProductIdentifierField;
    }
    set {
        this.subscriptionProductIdentifierField = value;
    }
}

Anyпомощь будет очень ценится.

С уважением Zal

Ответы [ 2 ]

1 голос
/ 27 января 2012

В вашей коллекции не один элемент, а два, один из которых имеет значение null

, просто отфильтруйте нулевые элементы во время добавления или даже до возврата, в зависимости от вашей бизнес-логики

public SubscriptionProductIdentifierType[] SubscriptionProductIdentifier {
    get {
        return this.subscriptionProductIdentifierField.Where(s=>s!=null).ToArray();
    }
...
}

Надеюсь, это поможет

0 голосов
/ 27 января 2012

XmlIgnoreAttribute будет игнорировать элемент, а не только элементы, которые являются нулевыми в массиве. Если у вас нет возможности фильтровать результаты или заблаговременно удалять нулевой узел, сохраните локальную переменную для хранения отфильтрованных результатов и отложенной загрузки.

private SubscriptionProductIdentifierType[] _subscriptionProductIdentifierField = null;
private SubscriptionProductIdentifierType[] _filteredSubscriptionProductIdentifier = null;

public SubscriptionProductIdentifierType[] SubscriptionProductIdentifier
{
    get { 
    return this._filteredSubscriptionProductIdentifier ?? (
        _filteredSubscriptionProductIdentifier = Array.FindAll(
            this._subscriptionProductIdentifierField, 
            delegate(SubscriptionProductIdentifierType t) { return t != null; } ));

}
    set
    {
        this._subscriptionProductIdentifierField = value;
        this._filteredSubscriptionProductIdentifier = null;
    }
} 
...