0

Need a bit of help. I have an XML with the same elements nested within each other. I was able to create a C# class using the Convert XML String to Object question, pasting special the XML in a class. The thing is that code keeps creating class for each nested element. I just want one generic class for all the children elements.

Here's the sample XML:

 <?xml version="1.0" encoding="utf-8" ?>
<CompanyFolders>
  <company title="My Company">
    <departments>
      <department title="Retail Operations">
        <folders>
          <folder tite="Model Store"/>
          <folder tite="Retail Ops Manual"/>
          <folder tite="VM Guides &amp; planograms"/>
          <folder tite="About our Team"/>
        </folders>
      </department>
      <department title="Buying">
        <folders>
          <folder tite="Gold Jewellery">
            <folders>
              <folder tite="Gold">
                <folders>
                  <folder title="Color Range"/>
                  <folder title="Launch Packs"/>
                  <folder title="Grading"/>
                  <folder title="Herolines"/>
                  <folder title="Top Sellers"/>
                  <folder title="Launch &amp; price Change Calendar"/>
                </folders>
              </folder>
              <folder tite="Branded">
                <folders>
                  <folder title="Color Range"/>
                  <folder title="Launch Packs"/>
                  <folder title="Grading"/>
                  <folder title="Herolines"/>
                  <folder title="Top Sellers"/>
                  <folder title="Launch &amp; price Change Calendar"/>
                </folders>
              </folder>
            </folders>    
          </folder>
          <folder tite="Rings">
            <folders>
              <folder tite="Monthly Sales by store by diamond brand" />
              <folder tite="Line lists &amp; core ranges" />
              <folder tite="Current Hero Lines" />
              <folder tite="Diamond ambassador conference call details and agenda" />
            </folders>    
          </folder>
        </folders>
      </department>
      <department title="Property">
        <folders>
          <folder tite="Maintenance Forms"/>
          <folder tite="Portal for reporting maintenance issues"/>
          <folder tite="Security Advice"/>
          <folder tite="Security Policy"/>
          <folder tite="H&amp;S Policy and awareness"/>
          <folder tite="H&amp;S Forms"/>
          <folder tite="Insurance Documents"/>
          <folder tite="Out of Emergencies Contact list"/>
        </folders>
      </department>
    </departments>
  </company>
</CompanyFolders>

And the class created:

namespace MyXML
{

    /// <remarks/>
    [System.SerializableAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
    public partial class CompanyFolders
    {

        private CompanyFoldersCompany[] companyField;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("company")]
        public CompanyFoldersCompany[] company
        {
            get
            {
                return this.companyField;
            }
            set
            {
                this.companyField = value;
            }
        }
    }

    /// <remarks/>
    [System.SerializableAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    public partial class CompanyFoldersCompany
    {

        private CompanyFoldersCompanyDepartment[] departmentsField;

        private string titleField;

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute("department", IsNullable = false)]
        public CompanyFoldersCompanyDepartment[] departments
        {
            get
            {
                return this.departmentsField;
            }
            set
            {
                this.departmentsField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string title
        {
            get
            {
                return this.titleField;
            }
            set
            {
                this.titleField = value;
            }
        }
    }

    /// <remarks/>
    [System.SerializableAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    public partial class CompanyFoldersCompanyDepartment
    {

        private CompanyFoldersCompanyDepartmentFolder[] foldersField;

        private string titleField;

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute("folder", IsNullable = false)]
        public CompanyFoldersCompanyDepartmentFolder[] folders
        {
            get
            {
                return this.foldersField;
            }
            set
            {
                this.foldersField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string title
        {
            get
            {
                return this.titleField;
            }
            set
            {
                this.titleField = value;
            }
        }
    }

    /// <remarks/>
    [System.SerializableAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    public partial class CompanyFoldersCompanyDepartmentFolder
    {

        private CompanyFoldersCompanyDepartmentFolderFolder[] foldersField;

        private string titeField;

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute("folder", IsNullable = false)]
        public CompanyFoldersCompanyDepartmentFolderFolder[] folders
        {
            get
            {
                return this.foldersField;
            }
            set
            {
                this.foldersField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string tite
        {
            get
            {
                return this.titeField;
            }
            set
            {
                this.titeField = value;
            }
        }
    }

    /// <remarks/>
    [System.SerializableAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    public partial class CompanyFoldersCompanyDepartmentFolderFolder
    {

        private CompanyFoldersCompanyDepartmentFolderFolderFolder[] foldersField;

        private string titeField;

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute("folder", IsNullable = false)]
        public CompanyFoldersCompanyDepartmentFolderFolderFolder[] folders
        {
            get
            {
                return this.foldersField;
            }
            set
            {
                this.foldersField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string tite
        {
            get
            {
                return this.titeField;
            }
            set
            {
                this.titeField = value;
            }
        }
    }

    /// <remarks/>
    [System.SerializableAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    public partial class CompanyFoldersCompanyDepartmentFolderFolderFolder
    {

        private string titleField;

        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string title
        {
            get
            {
                return this.titleField;
            }
            set
            {
                this.titleField = value;
            }
        }
    }
}

So you can notice that CompanyFoldersCompanyDepartmentFolderFolder and CompanyFoldersCompanyDepartmentFolderFolderFolder are created for the inner Folders, however I just wanted a kind of recursive CompanyFoldersCompanyDepartmentFolder.

I appreciate the help.

Community
  • 1
  • 1

1 Answers1

0

Try code below. You should learn to spell title (not tite).

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

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            XElement companyFolders = (XElement)doc.FirstNode;
            new CompanyFolders(companyFolders);
        }
    }
    public class CompanyFolders
    {
        public static List<Company> companies = new List<Company>();
        public CompanyFolders(XElement companies)
        {
            CompanyFolders.companies = companies.Elements("company").Select(x => new Company(x)).ToList();
        }

        public class Company
        {
            string title { get; set; }
            public List<Department> departments = new List<Department>();
            public Company(XElement company)
            {
                title = (string)company.Attribute("title");
                departments = company.Descendants("department").Select(x => new Department(x)).ToList();
            }
            public class Department
            {
                string title { get; set; }
                public List<Folder> folders = new List<Folder>();
                public Department(XElement department)
                {
                    title = (string)department.Attribute("title");
                    folders = department.Element("folders").Elements("folder").Select(x => new Folder(x)).ToList();
                }
                public class Folder
                {
                    string title { get; set; }
                    public List<Folder> folders = new List<Folder>();
                    public Folder(XElement folder)
                    {
                        title = (string)folder.Attribute("title");
                        if (folder.Element("folders") != null)
                        {
                            folders = folder.Element("folders").Elements("folder").Select(x => new Folder(x)).ToList();
                        }
                    }
                }
            }
        }
    }
}
jdweng
  • 33,250
  • 2
  • 15
  • 20
  • Thanks jdweng. Title mistake was just a typo. Thanks for telling me. I tried the solution you provided and am just wondering about the usage. How can I iterate among the elements and stuff. Cheers – user17685 Feb 08 '17 at 09:46
  • Each class has a List<> object so you can iterate like any list. The folders are recursive so you need to use a recursive algorithm to iterate through the nested classes. – jdweng Feb 08 '17 at 10:25