【问题标题】:XML Parsing to c# objectsXML 解析为 c# 对象
【发布时间】:2012-07-06 03:02:06
【问题描述】:

我正在尝试做一个 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)如果我没有我的错误在哪里以及我应该如何让它正常工作? 提前致谢!

【问题讨论】:

    标签: c# asp.net linq-to-sql xml-parsing


    【解决方案1】:
    modify this line add 's'( vendor -> vendors)
    
    -> vendors.vendor_list = (from c in d.Descendants("vendor")
    
    and the same case for group -> groups
    

    【讨论】:

    • 在我看来问题出在类定义中,但看不出有什么问题:X
    【解决方案2】:

    而不是自己制作课程。

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

    【讨论】:

    • 仅供参考,xsd.exe 实际上可以通过示例了解 XML,而无需经历编写适当 XSD 的麻烦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多