为嵌套 XML 创建通用 类

Create generic classes for nested XML

我可能会走错方向,但我想为以下 XML 结构创建通用 类。

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <success>true</success>
   <data>
      <item>
         <Barcode>20450004941980</Barcode>
         <ChildDocuments>
            <success>true</success>
            <data>
               <item>
                  <StateId>10</StateId>
               </item>
            </data>
            <errors />
            <warnings />
            <info />
         </ChildDocuments>
      </item>
   </data>
   <errors />
   <warnings />
   <info />
</root>

ChildDocuments 中以及 ChildDocuments 中可能有更多元素。我创建了以下结构:

[Serializable()]
[System.Xml.Serialization.XmlRoot("root")]
public class XmlRoot<T>
{
    public XmlRoot()
    {
        DataArray = new List<T>();
    }

    [XmlElement("data")]
    public List<T> DataArray { get; set; }
}

[Serializable()]
public class XmlRootData<T>
{
    public XmlRootData()
    {
        ItemArray = new List<T>();
    }

    [XmlElement("item")]
    public List<T> ItemArray { get; set; }
}

现在我正在考虑如何为 ChildDocument 创建一些通用的东西。基本上它与根 document.So 具有相同的通用结构,我知道 ChildDocument 可能只有 1 个级别,因此我可以创建 2 个更通用的 类,例如:

[Serializable()]
public class XmlRootData<T,U>
{
    public XmlRootData()
    {
        ItemArray = new List<T>();
    }

    [XmlElement("item")]
    public List<T> ItemArray { get; set; }
    public List<XmlRoot<U>> ChildDataRoot { get; set; }
}

我可以为 Child inner xml 再创建 2 个额外的 类,但是我不是 100% 确定最多可以有 2 个级别...

如果可以选择通过工具为您的 xml 生成 class,那么您可以按照以下步骤操作。如果您有包含完整数据的真实 xml 文件,这将有所帮助。我已经根据问题中传递的 xml 文件进行了拍摄。

  1. 从 XML 文件创建 XSD
  2. 来自 XSD Create Class for it

下面是生成的 Class,现在基于这个 class 你可以调整你的 class 或按原样使用下面的 class。您还可以重命名属性并通过使用适当的属性装饰它们来自定义所有名称。

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.42000
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

using System.Xml.Serialization;

// 
// This source code was auto-generated by xsd, Version=4.6.81.0.
// 


/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.81.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class root {

    private bool successField;

    private rootData dataField;

    private object errorsField;

    private object warningsField;

    private object infoField;

    /// <remarks/>
    public bool success {
        get {
            return this.successField;
        }
        set {
            this.successField = value;
        }
    }

    /// <remarks/>
    public rootData data {
        get {
            return this.dataField;
        }
        set {
            this.dataField = value;
        }
    }

    /// <remarks/>
    public object errors {
        get {
            return this.errorsField;
        }
        set {
            this.errorsField = value;
        }
    }

    /// <remarks/>
    public object warnings {
        get {
            return this.warningsField;
        }
        set {
            this.warningsField = value;
        }
    }

    /// <remarks/>
    public object info {
        get {
            return this.infoField;
        }
        set {
            this.infoField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.81.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class rootData {

    private rootDataItem itemField;

    /// <remarks/>
    public rootDataItem item {
        get {
            return this.itemField;
        }
        set {
            this.itemField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.81.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class rootDataItem {

    private ulong barcodeField;

    private rootDataItemChildDocuments childDocumentsField;

    /// <remarks/>
    public ulong Barcode {
        get {
            return this.barcodeField;
        }
        set {
            this.barcodeField = value;
        }
    }

    /// <remarks/>
    public rootDataItemChildDocuments ChildDocuments {
        get {
            return this.childDocumentsField;
        }
        set {
            this.childDocumentsField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.81.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class rootDataItemChildDocuments {

    private bool successField;

    private rootDataItemChildDocumentsData dataField;

    private object errorsField;

    private object warningsField;

    private object infoField;

    /// <remarks/>
    public bool success {
        get {
            return this.successField;
        }
        set {
            this.successField = value;
        }
    }

    /// <remarks/>
    public rootDataItemChildDocumentsData data {
        get {
            return this.dataField;
        }
        set {
            this.dataField = value;
        }
    }

    /// <remarks/>
    public object errors {
        get {
            return this.errorsField;
        }
        set {
            this.errorsField = value;
        }
    }

    /// <remarks/>
    public object warnings {
        get {
            return this.warningsField;
        }
        set {
            this.warningsField = value;
        }
    }

    /// <remarks/>
    public object info {
        get {
            return this.infoField;
        }
        set {
            this.infoField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.81.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class rootDataItemChildDocumentsData {

    private rootDataItemChildDocumentsDataItem itemField;

    /// <remarks/>
    public rootDataItemChildDocumentsDataItem item {
        get {
            return this.itemField;
        }
        set {
            this.itemField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.81.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class rootDataItemChildDocumentsDataItem {

    private byte stateIdField;

    /// <remarks/>
    public byte StateId {
        get {
            return this.stateIdField;
        }
        set {
            this.stateIdField = value;
        }
    }
}