2012-01-27 123 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; 
    } 
} 

任何幫助將非常感激。

親切的問候 扎爾

+0

來自@ArsenMkrt的好點。陣列的長度是多少? – 2012-01-27 12:15:23

+0

我只將兩個項目分配給數組集合 – Zal 2012-01-27 12:25:12

+0

如果您序列化(從.NET到XML),您可以嘗試將XmlRootAttribute上的IsNullable = false添加到SubscriptionProductIdentifier。請參閱http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlrootattribute.isnullable.aspx – Huusom 2012-01-27 14:18:17

回答

1

沒有您的集合中的一個項目而是兩個,其中一個是空

只是濾波器附加在空項目,甚至返回之前,這取決於你的業務邏輯

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

希望這有助於

+0

謝謝,不幸的是我沒有.Where(這是從linq到SQL),所以在這個例子對這個項目沒有幫助:( – Zal 2012-01-27 12:29:23

+0

@Zal,你可以在沒有where子句的情況下進行過濾,例如在for循環中,想法是在序列化之前過濾空值 – 2012-01-27 12:34:44

+1

@Zal你應該有.where(... )這很簡單,LINQ不是LINQ to SQL,你正在使用哪個版本的.NET? – 2012-01-27 13:00:15

0

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; 
    } 
}