2017-02-07 2 views
0

Brauchen Sie ein wenig Hilfe. Ich habe ein XML mit den gleichen Elementen ineinander verschachtelt. Ich konnte eine C# -Klasse unter Verwendung der Convert XML String to Object Frage erstellen und das XML in eine Klasse einfügen. Die Sache ist, dass Code Klassen für jedes verschachtelte Element erstellt. Ich möchte nur eine generische Klasse für alle Kinderelemente.Verwandeln Sie Nested XML mit denselben Elementen in Klasse

Hier ist der XML-Beispiel:

<?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> 

Und die Klasse erstellt:

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

Sie können also feststellen, dass CompanyFoldersCompanyDepartmentFolderFolder und CompanyFoldersCompanyDepartmentFolderFolderFolder für die inneren Ordner erstellt werden, aber ich wollte nur eine Art von rekursiv CompanyFoldersCompanyDepartmentFolder.

Ich schätze die Hilfe.

Antwort

0

Versuchen Sie den folgenden Code. Sie sollten lernen, Titel zu buchstabieren (nicht 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(); 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+0

Dank jdweng. Titelfehler war nur ein Tippfehler. Danke, dass du es mir gesagt hast. Ich habe die von Ihnen angebotene Lösung ausprobiert und frage mich nur nach der Verwendung. Wie kann ich zwischen den Elementen und den Dingen iterieren? Prost – user17685

+0

Jede Klasse hat ein List <> -Objekt, so dass Sie wie jede andere Liste iterieren können. Die Ordner sind rekursiv, daher müssen Sie einen rekursiven Algorithmus verwenden, um die verschachtelten Klassen zu durchlaufen. – jdweng

Verwandte Themen