2013-03-15 2 views
3

Позвольте мне принять это прямо. Можно ли не сериализовать элементы XMLArray, если он равен нулю? Как и в следующем XML, «Детали» используется. Возможно ли иметь его в XML, если оно равно null. Пожалуйста, проверьте мой код и по достоинству оцените его.Сериализация XML без null XMLArray

<agr:InvoiceNo>99999</agr:InvoiceNo> 
    <agr:Header> 
     <agr:LineNo>1</agr:LineNo> 
     <agrlib:InvoiceDate>2013-02-13</agrlib:InvoiceDate> 
     <agrlib:DueDate>2013-03-15</agrlib:DueDate> 
     <agr:ArchiveRef>27624642</agr:ArchiveRef> 
     <agr:ArchivePath>Images\20130315\10_00000030_00000</agr:ArchivePath> 
     <agr:Currency>SEK</agr:Currency> 
     <agr:Seller> 
     <agrlib:CompRegNo>999999</agrlib:CompRegNo> 
     </agr:Seller> 
     <agr:Buyer> 
     <agrlib:CompanyCode>10</agrlib:CompanyCode> 
     <agr:Accountable /> 
     </agr:Buyer> 
     <agr:PaymentInfo> 
     <agr:AccountNumber>99999</agr:AccountNumber> 
     <agrlib:BacsId /> 
     </agr:PaymentInfo> 
     <agrlib:ReferenceCode> 
     <agrlib:Code>AA</agrlib:Code> 
     <agrlib:Value>AAAA</agrlib:Value> 
     <agrlib:Description /> 
     </agrlib:ReferenceCode> 
    </agr:Header> 
    <Details />     <!-- this one --> 
    <agr:Summary> 
     <agr:TotalTax>170.36</agr:TotalTax> 
     <agr:TotalInclTax>1590.00</agr:TotalInclTax> 
    </agr:Summary> 
    </agr:Invoice> 

[Serializable] 
public class Invoice 
{ 
    private Header _header = new Header(); 
    private Summary _summary = new Summary(); 
    private List<Detail> _details = new List<Detail>(); 

    [XmlElement("InvoiceNo")] 
    public string InvoiceNo { get; set; } 

    [XmlElement("Header")] 
    public Header Header 
    { 
     get { return _header; } 
     set { _header = value; } 
    } 

    [XmlArray("Details"), XmlArrayItem("Detail", typeof(Detail), IsNullable=false)] 
    public List<Detail> Details 
    { 
     get { return _details; } 
     set { _details = value; } 
    } 

    [XmlElement("Summary")] 
    public Summary Summary 
    { 
     get { return _summary; } 
     set { _summary = value; } 
    } 
} 

[XmlType(TypeName = "Detail"), Serializable] 
public class Detail 
{ 
    private Product _product = new Product(); 
    static CultureInfo ci = CultureInfo.InvariantCulture; 
    private float _lineTotExclTax = 0; 

    [XmlElement("LineNo")] 
    public int LineNo { get; set; } 

    [XmlIgnore] 
    public float LineTotExclTax 
    { 
     get { return _lineTotExclTax; } 
     set { _lineTotExclTax = value; } 
    } 

    [XmlElement("LineTotExclTax")] 
    public string CustomLineTotExclTax 
    { 
     get { return LineTotExclTax.ToString("#0.00", ci); } 
     set { float.TryParse(value, NumberStyles.Float, ci, out _lineTotExclTax); } 
    } 

    [XmlElement("Products")] 
    public Product Product 
    { 
     get { return _product; } 
     set { _product = value; } 
    } 
} 
+0

Вы имеете в виду "null"? или просто «пустым»? нулевые значения обычно * игнорируются –

ответ

5

Если список действительно null это является игнорируется. Для того, чтобы получить результат вы показываете, она должна быть пустой не- null список, вероятно, из-полевому инициализаторе:

private List<Detail> _details = new List<Detail>(); 

Если вы не можете сделать это null, а затем рассмотреть ShouldSerialize*:

[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
public bool ShouldSerializeDetails() 
{ 
    return _details != null && _details.Count != 0; 
} 

Это определяет настраиваемое правило, когда свойство Details должно/не должно быть сериализовано.

+0

Вы правы, это было связано с инициализатором поля. Задача решена. благодаря – mrd

Смежные вопросы