2

我正在尝试做一个 XML 解析器,它将使用 REST 服务从网站中提取数据,通信协议是 HTTP,我得到的数据是 XML 格式,在对不同地址的多次请求后,我得到了我需要的数据服务器。我需要将这些数据解析为 c# 对象,以便最近可以使用它们。服务器上的信息分为 5 个级别(我愿意只做其中的 4 个) 1-供应商列表 2-组列表 3-子组列表 4-产品列表 5-有关完整信息的列表产品 达到第 4 级后,我需要检查产品是否在我的数据库中,或者它是否有不同的详细信息,以便我可以添加或更新它。

通过对服务器的“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 结构对于子组和产品是类比的,除了对于产品我有更多的元素,如目录编号、价格等。

我的课程如下:

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

和这样的 Parser 方法:

            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而不在我的计算机上创建文件),如果我没有,我的错误在哪里,我应该如何让它正常工作?提前致谢!

4

2 回答 2

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

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

and the same case for group -> groups
于 2012-07-05T16:50:55.863 回答
0

而不是自己制作课程。

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

于 2012-07-05T16:51:38.213 回答