2012-01-27 2 views
4

У меня есть кусок XML, который выглядит какИгнорирование нулевого значения в XML сериализациях

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

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

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

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

Любая помощь будет очень признательна.

С наилучшими пожеланиями Zal

+0

Хороший отзыв от @ArsenMkrt. Какова длина массива? –

+0

Я только назначил два элемента массиву – Zal

+0

Если вы сериализуете (перейдете от .NET к XML), вы можете попробовать добавить IsNullable = false в XmlRootAttribute в SubscriptionProductIdentifier. См. Http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlrootattribute.isnullable.aspx – Huusom

ответ

1

Существует не один элемент в вашей коллекции, но два, один из которых является нулевым

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

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

Надеется, что это помогает

+0

Спасибо, к сожалению, у меня нет .Where (это от linq до sql), поэтому в в этом случае это не полезно для этого проекта :( – Zal

+0

@Zal, вы можете фильтровать без предложения where, например, для цикла, идея состоит в том, чтобы отфильтровать нулевые значения перед сериализацией. –

+1

@ Zal у вас должен быть .where (...) это простой LINQ, а не LINQ to SQL. Какую версию .NET вы используете? –

0

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

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; 
    } 
} 
Смежные вопросы