2012-07-05 5 views
2

J'essaie de faire un analyseur XML qui va extraire des données d'un site Web en utilisant le service REST, le protocole de communication est HTTP, les données que je reçois est au format XML, et j'arrive aux données I besoin après plusieurs demandes à différentes adresses sur le serveur. J'ai besoin d'analyser ces données pour C# objets afin que je puisse fonctionner avec eux ces derniers temps. Les informations sur le serveur est sur 5 niveaux (je suis prêt à faire le travail que 4 d'entre eux pour savoir) 1 Liste des fournisseurs 2 Liste des groupes 3 Liste des sous-groupes 4 Liste des produits 5 -Liste des informations complètes sur les produits Après que j'arrive au 4ème niveau, j'ai besoin de vérifier si le produit est dans ma base de données ou s'il a des détails différents afin que je puisse ajouter ou mettre à jour.XML Analyse des objets C#

Avec "GET" demande à un serveur je reçois XML avec cette structure:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <vendors> 
       <vendor> 
         <id>someID</id> 
         <name>someName</name> 
       </vendor> 
       <vendor> 
         <id>someId1</id> 
         <name>somename1</name> 
       </vendor> 
    </vendors> 

structure XML pour les groupes est le même:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<groups vendor_id="43153185318"> 
     <group> 
       <id>someID</id> 
       <name>someName</name> 
     </group> 
     <group> 
       <id>someId1</id> 
       <name>somename1</name> 
     </group> 

La structure XML est analogique pour les sous-groupes et les produits, sauf pour les produits, j'ai plus d'éléments comme catalog_num, prix, etc.

J'ai fait les classes comme suit:

public class VendorList 
    { 
      public List<Vendor> vendor_list { get; set; } 
      public VendorList() 
      { 
        vendor_list = new List<Vendor>(); 
      } 
    } 
    public class Vendor 
    { 
      public string id { get; set; } 
      public string name { get; set; } 
      public List<Group> groups_list { get; set; } 
      public Vendor() 
      { 
        id = "N/A"; 
        name = "N/A"; 
        groups_list = new List<Group>(); 
      } 
    } 
    public class Group 
    { 
      public string id { get; set; } 
      public string name { get; set; } 
      public List<SubGroup> subgroup_list { get; set; } 
      public Group() 
      { 
        id = "N/A"; 
        name = "N/A"; 
        subgroup_list = new List<SubGroup>(); 
      } 
    } 
    public class SubGroup 
    { 
      public string id { get; set; } 
      public string name { get; set; } 
      public List<Product> product_list { get; set; } 
      public SubGroup() 
      { 
        id = "N/A"; 
        name = "N/A"; 
        product_list = new List<Product>(); 
      } 
    } 
    public class Product 
    { 
      public string available { get; set; } 
      public string catalog_num { get; set; } 
      public string code { get; set; } 
      public string currency { get; set; } 
      public string description { get; set; } 
      public string haracteristics { get; set; } 
      public string product_id { get; set; } 
      public string model { get; set; } 
      public string name { get; set; } 
      public string price { get; set; } 
      public string price_dds { get; set; } 
      public string picture_url { get; set; } 
      public Product() 
      { 
        available = "N/A"; 
        catalog_num = "N/A"; 
        code = "N/A"; 
        currency = "N/A"; 
        description = "N/A"; 
        haracteristics = "N/A"; 
        product_id = "N/A"; 
        model = "N/A"; 
        name = "N/A"; 
        price = "N/A"; 
        price_dds = "N/A"; 
        picture_url = "N/A"; 
      } 
    } 

et la méthode Parser comme ceci:

  public static void FillVendor(string url) 
      { 
        string result = GetXMLstream(url); 
        var vendors = new VendorList(); 
        XmlDocument doc = new XmlDocument(); 
        doc.Load(new StringReader(result)); 
        doc.Save(@"D:/proba/proba.xml"); 
        XDocument d = XDocument.Load(@"D:/proba/proba.xml"); 
        vendors.vendor_list = (from c in d.Descendants("vendor") 
                   select new Vendor() 
                   { 
                     id = c.Element("id").Value, 
                     name = c.Element("name").Value 
                   }).ToList<Vendor>(); 
        foreach (Vendor v in vendors.vendor_list) 
        { 
          FillGroups(v.id); 
        } 
      } 
      public static void FillGroups(string vendorID) 
      { 
        string url = "main address" + vendorID; 
        string result = GetXMLstream(url); 
        var group = new Vendor(); 
        XmlDocument doc = new XmlDocument(); 
        doc.Load(new StringReader(result)); 
        doc.Save(@"D:/proba/proba1.xml"); 
        XDocument d = XDocument.Load(@"D:/proba/proba1.xml"); 
        group.groups_list = (from g in d.Descendants("group") 
                  select new Group() 
                  { 
                    id = g.Element("id").Value, 
                    name = g.Element("name").Value 
                  }).ToList<Group>(); 
        foreach (Group g in group.groups_list) 
        { 
          FillSubGroup(vendorID, g.id); 
        } 
      } 
      public static void FillSubGroup(string vendorID, string groupID) 
      { 
        string url = "main address" + vendorID+"/"+groupID; 
        string result = GetXMLstream(url); 
        var subgroup = new Group(); 
        XmlDocument doc = new XmlDocument(); 
        doc.Load(new StringReader(result)); 
        doc.Save(@"D:/proba/proba2.xml"); 
        XDocument d = XDocument.Load(@"D:/proba/proba2.xml"); 
        subgroup.subgroup_list = (from g in d.Descendants("subgroup") 
                  select new SubGroup() 
                  { 
                    id = g.Element("id").Value, 
                    name = g.Element("name").Value 
                  }).ToList<SubGroup>(); 
        foreach (SubGroup sb in subgroup.subgroup_list) 
        { 
          FillProduct(vendorID, groupID, sb.id); 
        } 
      } 
      public static void FillProduct(string vendorID,string groupID,string subgroupID) 
      { 
        string url = "main address" + vendorID + "/" + groupID+"/"+subgroupID; 
        string result = GetXMLstream(url); 
        var product = new SubGroup(); 
        XmlDocument doc = new XmlDocument(); 
        doc.Load(new StringReader(result)); 
        doc.Save(@"D:/proba/proba2.xml"); 
        XDocument d = XDocument.Load(@"D:/proba/proba2.xml"); 
        product.product_list = (from g in d.Descendants("subgroup") 
                     select new Product() 
                     { 
                       available = g.Element("available").Value, 
                       catalog_num = g.Element("catalog_num").Value, 
                       code = g.Element("code").Value, 
                       currency = g.Element("currency").Value, 
                       description = g.Element("description").Value, 
                       haracteristics = g.Element("haracteristics").Value, 
                       product_id = g.Element("id").Value, 
                       model = g.Element("model").Value, 
                       name = g.Element("name").Value, 
                       price = g.Element("price").Value, 
                       price_dds = g.Element("price_dds").Value, 
                       picture_url = g.Element("small_picture").Value, 
                     }).ToList<Product>(); 
      } 

Mais après avoir terminé l'analyse syntaxique j'essaie de vérifier si mes listes sont remplis avec des objets, mais je reçois un erreur qui dit qu'ils sont null "NullReferenceException" Donc ma question est que j'ai fait des classes correctement et est ma bonne méthode d'analyse (vous pouvez suggérer comment analyser le xml sans créer un fichier sur mon ordinateur) et si je ne l'ai pas fait est mon erreur et comment dois-je le faire fonctionner correctement? Merci d'avance!

Répondre

1
modify this line add 's'(vendor -> vendors) 

-> vendors.vendor_list = (from c in d.Descendants("vendor") 

and the same case for group -> groups 
+0

avec ce changement, je reçois la même erreur: NullReference –

+0

je recherche Bogdan –

+0

À mon avis, le problème est dans la définion de classe, mais ne peut pas voir ce qui est faux: X –

0

Au lieu de créer vous-même les classes.

Créez un schéma XML correctement formaté manuellement ou avec Visual Studio puis, à partir de ce fichier XSD créé, générez vos classes C#.

+0

Pour votre information, 'xsd.exe' peut effectivement grok XML -par exemple sans avoir à passer par le hassle de l'écriture d'un XSD approprié. – bluevector