定义和反序列化空类

问题描述 投票:0回答:1

我得到的是包含 "信封 "的XML数据。为了简洁起见,我把重点放在 "自定义字段 "上,它是一个 "字段 "的集合。

这里是类定义中给我带来问题的部分。

namespace Model.DocuSignEnvelope
{
    [XmlRoot(ElementName = "CustomFields", Namespace = "http://www.docusign.net/API/3.0")]
    public class CustomFields
    {
        [XmlElement(ElementName = "CustomField", Namespace = "http://www.docusign.net/API/3.0")]
        public List<CustomField> CustomField { get; set; }
    }

    [XmlRoot(ElementName = "CustomField", Namespace = "http://www.docusign.net/API/3.0")]
    public class CustomField
    {
        [XmlElement(ElementName = "Name", Namespace = "http://www.docusign.net/API/3.0")]
        public string Name { get; set; } = "";
        [XmlElement(ElementName = "Show", Namespace = "http://www.docusign.net/API/3.0")]
        public string Show { get; set; } = "";
        [XmlElement(ElementName = "Required", Namespace = "http://www.docusign.net/API/3.0")]
        public string Required { get; set; } = "";
        [XmlElement(ElementName = "Value", Namespace = "http://www.docusign.net/API/3.0")]
        public string Value { get; set; } = "";
        [XmlElement(ElementName = "CustomFieldType", Namespace = "http://www.docusign.net/API/3.0")]
        public string CustomFieldType { get; set; } = "";
    }
}

public static class DocuSignExtensionMethods
{
    public static T DeserializeXmlX<T>(this string input) where T : class
    {
        XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(T));
        using StringReader sr = new StringReader(input);
        return (T)ser.Deserialize(sr);
    }
}

如果我得到一个空的列表,快乐时光,它的反序列化没有任何问题。

<?xml version="1.0" encoding="utf-8"?>
<DocuSignEnvelopeInformation 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://www.docusign.net/API/3.0">
    <EnvelopeStatus>
        <RecipientStatuses>
            <RecipientStatus>
                <Type>Signer</Type>
                ...
                <CustomFields />
                ...

但如果我得到一个 "空的 "自定义字段的列表。

<?xml version="1.0" encoding="utf-8"?>
<DocuSignEnvelopeInformation 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://www.docusign.net/API/3.0">
    <EnvelopeStatus>
        <RecipientStatuses>
            <RecipientStatus>
                <Type>Signer</Type>
                ...
                <CustomFields>
                    <CustomField />
                    <CustomField />
                    <CustomField />
                </CustomFields>
                ...

它用Exception出错。

-       ex  {"There is an error in XML document (20, 7)."}  System.Exception {System.InvalidOperationException}
-       InnerException  {"ReadElementContentAs() methods cannot be called on an element that has child elements. Line 20, position 7."} System.Exception {System.Xml.XmlException}

我怎样才能告诉Deserializer将这些字段反序列化为一个空的List(没有有效的条目)或一个有3个空CustomFields的列表。

c# xml deserialization xml-deserialization
1个回答
1
投票

下面的代码工作。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create(FILENAME);
            XmlSerializer serializer = new XmlSerializer(typeof(EnvelopeInfo));
            EnvelopeInfo fields = (EnvelopeInfo)serializer.Deserialize(reader);
        }
    }
    [XmlRoot(ElementName = "EnvelopeInfo", Namespace = "http://www.docusign.net/API/3.0")]
    public class EnvelopeInfo
    {
        [XmlElement(ElementName = "EnvelopeStatus", Namespace = "http://www.docusign.net/API/3.0")]
        public EnvelopeStatus EnvelopeStatus { get; set; } 
    }
    public class EnvelopeStatus
    {
        [XmlArray(ElementName = "RecipientStatuses", Namespace = "http://www.docusign.net/API/3.0")]
        [XmlArrayItem(ElementName = "RecipientStatus", Namespace = "http://www.docusign.net/API/3.0")]
        public RecipientStatus[] RecipientStatus { get; set; } 
    }
    public class  RecipientStatus
    {
        [XmlElement(ElementName = "CustomFields", Namespace = "http://www.docusign.net/API/3.0")]
        public CustomFields CustomFields { get; set; }
    }

    public class CustomFields
    {
        [XmlElement(ElementName = "CustomField", Namespace = "http://www.docusign.net/API/3.0")]
        public List<CustomField> CustomField { get; set; }
    }

    [XmlRoot(ElementName = "CustomField", Namespace = "http://www.docusign.net/API/3.0")]
    public class CustomField
    {
        [XmlElement(ElementName = "Name", Namespace = "http://www.docusign.net/API/3.0")]
        public string Name { get; set; }
        [XmlElement(ElementName = "Show", Namespace = "http://www.docusign.net/API/3.0")]
        public string Show { get; set; }
        [XmlElement(ElementName = "Required", Namespace = "http://www.docusign.net/API/3.0")]
        public string Required { get; set; }
        [XmlElement(ElementName = "Value", Namespace = "http://www.docusign.net/API/3.0")]
        public string Value { get; set; }
        [XmlElement(ElementName = "CustomFieldType", Namespace = "http://www.docusign.net/API/3.0")]
        public string CustomFieldType { get; set; }
    }
}

使用了以下XML

<?xml version="1.0" encoding="utf-8"?>
<EnvelopeInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.docusign.net/API/3.0">
  <EnvelopeStatus>
    <RecipientStatuses>
      <RecipientStatus>
        <Type>Signer</Type>
        <CustomFields>
          <CustomField />
          <CustomField />
          <CustomField />
        </CustomFields>
      </RecipientStatus>
    </RecipientStatuses>
  </EnvelopeStatus>
</EnvelopeInfo>
© www.soinside.com 2019 - 2024. All rights reserved.