没有空XMLArray XML序列化 [英] XML serialization without null XMLArray

查看:168
本文介绍了没有空XMLArray XML序列化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

让我把它直。是否有可能,如果空不序列化XMLArray元素呢?正如在下面的XML详细信息时使用。是否有可能不把它在XML,如果它是空。请检查我的代码,会欣赏它的一些想法

 < AGR:InvoiceNo> 99999< / AGR:InvoiceNo> 
< AGR:页眉和GT;
< AGR:LINENO> 1 LT; / AGR:LINENO>
< agrlib:InvoiceDate> 2013年2月13日< / agrlib:InvoiceDate>
< agrlib:DUEDATE> 2013年3月15日< / agrlib:DUEDATE>
< AGR:ArchiveRef> 27624642< / AGR:ArchiveRef>
< AGR:ArchivePath> Images\20130315\10_00000030_00000< / AGR:ArchivePath>
< AGR:货币>&SEK LT; / AGR:货币>
< AGR:卖家>
< agrlib:CompRegNo> 999999< / agrlib:CompRegNo>
< / AGR:卖家>
< AGR:买家>
< agrlib:企业编码→10< / agrlib:企业编码>
< AGR:实报实销/>
< / AGR:买家>
< AGR:PaymentInfo>
< AGR:账户号码> 99999< / AGR:账户号码>
< agrlib:BacsId />
< / AGR:PaymentInfo>
< agrlib:ReferenceCode>
< agrlib:代码> AA< / agrlib:代码>
< agrlib:值> AAAA< / agrlib:值>
< agrlib:说明/>
< / agrlib:ReferenceCode>
< / AGR:页眉和GT;
<细节/> <! - 这一个 - >
< AGR:总结>
< AGR:TotalTax> 170.36< / AGR:TotalTax>
< AGR:TotalInclTax>&1590.00 LT; / AGR:TotalInclTax>
< / AGR:总结>
< / AGR:发票>






  [序列化] 
公共类发票
{
私人头_header =新标题();
私人摘要_Summary =新摘要();
私有列表<详情> _details =新的List<详情>();

[的XmlElement(InvoiceNo)]
公共字符串InvoiceNo {搞定;组; }

[的XmlElement(头)]
公共标题标题
{
{返回_header; }
集合{_header =价值; }
}

[XmlArray(详细信息),XmlArrayItem(详细信息中的typeof(详细信息),ISNULLABLE = FALSE)]
公开名单<详情>详情
{
{返回_details; }
集合{_details =价值; }
}

[的XmlElement(纲要)]
公共摘要摘要
{
{返回_Summary; }
集合{_Summary =价值; }
}
}

[XmlType将(类型名=详细信息),序列化]
公共类详细
{
私人产品_product =新产品();
静态CultureInfo的CI = CultureInfo.InvariantCulture;
私人浮动_lineTotExclTax = 0;

[的XmlElement(LINENO)]
公众诠释LINENO {搞定;组; }

[XmlIgnore]
公众持股量LineTotExclTax
{
{返回_lineTotExclTax; }
集合{_lineTotExclTax =价值; }
}

[的XmlElement(LineTotExclTax)]
公共字符串CustomLineTotExclTax
{
{返回LineTotExclTax.ToString(#0.00, CI); }
集合{float.TryParse(价值,NumberStyles.Float,CI,出_lineTotExclTax); }
}

[的XmlElement(产品)]
公共产品产品
{
{返回_product; }
集合{_product =价值; }
}
}


解决方案

如果列表确实是它的的忽略。为了让你显示输出,它必须是一个空的非 - 列表中,可能是由于现场初始化:

 私人列表<详情> _details =新的List<详情>(); 

如果你不能让 ,然后再考虑 ShouldSerialize *

  [可浏览(假),EditorBrowsable (EditorBrowsableState.Never)] 
公共BOOL ShouldSerializeDetails()
{
返回_details = NULL&放大器;!&安培; _details.Count!= 0;
}

这定义了当地产详细自定义规则应该/不应该被序列化。


Let me take it straight. Is it possible to not serialize an XMLArray elements if it null? As in following XML "Details" is used. Is it possible to not to have it in XML if it is null. Please check my code and will appreciate some thoughts on it.

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

解决方案

If the list truly is null it is ignored. To get the output you show, it must be an empty non-null list, probably due to the field-initializer:

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

If you can't make it null, then consider ShouldSerialize*:

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

This defines a custom rule for when the property Details should / should not be serialized.

这篇关于没有空XMLArray XML序列化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆