2017-02-07 1 views
0

Besoin d'un peu d'aide. J'ai un XML avec les mêmes éléments imbriqués les uns dans les autres. J'ai été capable de créer une classe C# en utilisant la question Convert XML String to Object, en collant le code XML spécial dans une classe. Le fait est que le code continue de créer une classe pour chaque élément imbriqué. Je veux juste une classe générique pour tous les éléments enfants.Activer le code XML imbriqué avec les mêmes éléments dans la classe

Voici le XML exemple:

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

Et la classe créée: mais je voulais juste

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

vous pouvez donc remarquer que CompanyFoldersCompanyDepartmentFolderFolder et CompanyFoldersCompanyDepartmentFolderFolderFolder sont créés pour les dossiers intérieurs, une sorte de CompanyFoldersCompanyDepartmentFolder récursif.

J'apprécie l'aide.

Répondre

0

Essayez le code ci-dessous. Vous devriez apprendre à épeler le titre (pas 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

Merci jdweng. Erreur de titre était juste une faute de frappe. Merci de me le dire. J'ai essayé la solution que vous avez fournie et je m'interroge sur l'utilisation. Comment puis-je itérer entre les éléments et d'autres choses. Cheers – user17685

+0

Chaque classe a un objet List <> pour que vous puissiez itérer comme n'importe quelle liste. Les dossiers sont récursifs, vous devez donc utiliser un algorithme récursif pour parcourir les classes imbriquées. – jdweng