2012-07-05 97 views
2

我想要做一个XML解析器,它将使用REST服务从网站提取数据,通信协议是HTTP,我得到的数据是XML格式,并且我得到数据I需要多次请求到服务器上的不同地址。我需要将这些数据解析为c#对象,以便我可以最近使用它们。 服务器上的信息是5级(我愿意做他们的工作,只有4知道)厂商 组2名录的产品 5子群的 3名录 4名单的 1名录 - 关于产品的完整信息列表 当我到达第4级时,我需要检查产品是否在我的数据库中,或者它有不同的详细信息,以便我可以添加或更新它。XML解析到c#对象

以 “get” 请求到服务器,我得到XML这种结构:团体

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

XML结构是相同的:

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

的XML结构类比对于小组和产品,除了产品我有更多的元素,如catalog_num,价格等

我做的类如下:

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

和解析器方法是这样的:

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

但整理分析后,我尝试检查,如果我的列表,只填充了对象,但我得到一个错误,说他们是空的“NullReferenceException” 所以我的问题是我正确创建类,并且我的解析方法是正确的(您可以建议如何解析xml而不在我的计算机上创建文件),如果我没有在哪里是我的错误,我应该如何使它正常工作? 在此先感谢!

回答

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

这种变化,我得到了同样的错误:NullReference – 2012-07-05 17:01:11

+0

我搜索波格丹 – 2012-07-05 17:02:47

+0

在我看来,问题是在类definion,但不能看到什么是错的:X – 2012-07-05 17:41:12

0

而不是自己制作课程。

手动或使用Visual Studio创建格式正确的XML Schema,然后从创建的XSD文件生成C#类。

+0

仅供参考,'xsd.exe'实际上可以神交XML而不必经过撰写适当的XSD的讨论。 – bluevector 2012-07-06 12:28:50