【问题标题】:C# Object Serialization to XML with ignoring null element [duplicate]忽略空元素的 C# 对象序列化到 XML [重复]
【发布时间】:2018-07-20 10:06:24
【问题描述】:
[XmlRoot("SAPInformationInterchangeXML")]
public class EWayBillResponseXML
{
    [XmlElement(ElementName = "SAPBusinessNetworkCustomerID")]
    public string SAPBusinessNetworkCustomerID { get; set; }

    [XmlElement(ElementName = "INVOIC")]
    public ResponseINVOIC Invoice { get; set; }
}

public class ResponseINVOIC
{
    [XmlElement(ElementName = "HeaderInformation")]
    public string HeaderInformation { get; set; }

    [XmlElement(ElementName = "AuthorizationInformation")]
    public string AuthorizationInformation { get; set; }
}


    var encoding = Encoding.GetEncoding("ISO-8859-1");
    XmlWriterSettings xmlWriterSettings = new XmlWriterSettings
    {
        Indent = true,
        OmitXmlDeclaration = false,
        Encoding = encoding
    };

    string requestHeaderInformation = null, requestAuthorizationInformation = null;

    EWayBillResponseXML obj = new EWayBillResponseXML
                    {
                        SAPBusinessNetworkCustomerID = "1",
                        Invoice = new ResponseINVOIC
                        {
                            HeaderInformation = requestHeaderInformation,
                            AuthorizationInformation = requestAuthorizationInformation
                        }
    };

    System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(obj.GetType());

    using (var stream = new MemoryStream())
    {
        using (var xmlWriter = XmlWriter.Create(stream, xmlWriterSettings))
        {
            x.Serialize(xmlWriter, obj);
        }
        Console.WriteLine(encoding.GetString(stream.ToArray()));
    }

我创建了 2 个名为 EWayBillResponseXML 和 ResponseINVOIC 的对象。我尝试使用上面的代码 sn-p 进行序列化。它给了我序列化的 XML,但它也返回空对象元素。我不需要序列化 ​​XML 中的空对象。你能帮帮我吗?

目前正在获取输出:

<?xml version="1.0" encoding="iso-8859-1"?>
<SAPInformationInterchangeXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SAPBusinessNetworkCustomerID>1</SAPBusinessNetworkCustomerID>
<INVOIC />
</SAPInformationInterchangeXML>

预期输出:

<?xml version="1.0" encoding="iso-8859-1"?>
<SAPInformationInterchangeXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SAPBusinessNetworkCustomerID>1</SAPBusinessNetworkCustomerID>
</SAPInformationInterchangeXML>

【问题讨论】:

  • &lt;INVOIC /&gt; 不是空元素。一个空元素看起来像&lt;INVOIC xsi:nil="true" /&gt;。相反,它是empty element。之所以发出它,是因为属性 Invoice 是非 null 且已分配,但其所有成员均为 null,因此不会创建子元素。如果您想防止为非空成员发出空元素,请参阅How do I stop and empty tag in XML serializer?。事实上,这可能是重复的。同意吗?

标签: c# xml xml-serialization xmlserializer


【解决方案1】:

您可以将以下方法添加到您的可序列化类 (EWayBillResponseXML):

        public bool ShouldSerializeInvoice()
        {
            return Invoice != null;
        }

你可以read more about that here

【讨论】:

  • sn-p 以上不工作
  • 它对我有用。我在一两年前编写的生产代码中广泛使用它。更不用说,你可以在微软的网站上看到这个例子。您是否将其与声明的属性放在同一类中?你是如何使用它的,它有什么“不工作”的地方?
  • 这并不能解决@Ronak 的问题,因为在他们的代码中,Invoice 实际上是非空的。然而,它的所有成员都是空的,这就是为它发出一个空元素的原因。见dotnetfiddle.net/MKmfDL
【解决方案2】:

正如@gmiley 所说,您应该将方法命名为ShouldSerialize___,其中___ 是应该或不应该序列化的属性的名称。该方法需要在所述属性所在的类中

所以,在你的情况下,在你的 EWayBillResponseXML 类中创建 ShouldSerializeResponseINVOIC 方法

[XmlRoot("SAPInformationInterchangeXML")]
public class EWayBillResponseXML
{
    [XmlElement(ElementName = "SAPBusinessNetworkCustomerID")]
    public string SAPBusinessNetworkCustomerID { get; set; }

    [XmlElement(ElementName = "INVOIC")]
    public ResponseINVOIC Invoice { get; set; }

    public book ShouldSerializeInvoice()
    {
        return Invoice != null;
    }

}

编辑: Dbc 在评论中正确地说 Invoice 实际上不是 null 而是空的,所以你应该处理它。

【讨论】:

  • 这并不能解决@Ronak 的问题,因为在他们的代码中,Invoice 实际上是非空的。然而,它的所有成员都是空的,这就是为它发出一个空元素的原因。此外,在任何ShouldSerializeXXX() 方法中,名称XXX 必须与属性名称匹配,此处为Invoice。在您的代码中,您使用的是返回类型的名称 ResponseINVOIC,这是不正确的。见dotnetfiddle.net/A20c5A
  • 你在这两种情况下都是对的。我看到你对问题发表评论,看到你是对的。至少我会修复代码以实际编译并返回如果属性应该被序列化:)
猜你喜欢
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-23
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
相关资源
最近更新 更多