Ignorer la valeur nulle dans la sérialisation XML
-
14-11-2019 - |
Question
J'ai un morceau de xml qui ressemble à quelque chose comme
<SubscriptionProduct>
<SubscriptionProductIdentifier>
<SubscriptionProductIdentifierType>
<SubscriptionProductIDType>01</SubscriptionProductIDType>
<ID>123456</ID>
<Value>AAAA</Value>
</SubscriptionProductIdentifierType>
<SubscriptionProductIdentifierType xsi:nil="true" />
</SubscriptionProductIdentifier>
<SubscriptionProductDescription />
</SubscriptionProduct>
Comme vous pouvez le constater que l'abonnementProduccidtentitifiertal est une collection et dans ce cas seulement contient un élément.
Comment puis-je ignorer le deuxième élément vide?
J'ai essayé d'ajouter l'Ignore XML, mais elle supprime toute la collection et je veux seulement que le deuxième élément de la collection soit supprimé s'il n'y a pas de données.
[System.Xml.Serialization.XmlIgnoreAttribute()]
public SubscriptionProductIdentifierType[] SubscriptionProductIdentifier {
get {
return this.subscriptionProductIdentifierField;
}
set {
this.subscriptionProductIdentifierField = value;
}
}
Toute aide serait très appréciée.
genre Cordialement Zal
La solution
There is not one item in your collection but two, one of which is null
just filter null items during addition, or even before return, depending on your business logic
public SubscriptionProductIdentifierType[] SubscriptionProductIdentifier {
get {
return this.subscriptionProductIdentifierField.Where(s=>s!=null).ToArray();
}
...
}
Hope this helps
Autres conseils
XmlIgnoreAttribute will ignore the member, not just items that are null within an array. If you have no way of filtering the results or removing the null node ahead of time, then store a local variable to hold the filtered results and lazy load it.
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;
}
}