2

REST サービスを使用して Web サイトからデータを抽出する XML パーサーを実行しようとしています。通信のプロトコルは 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 構造は、サブグループと製品に類似していますが、製品には catalog_num、price などの要素がさらにあります。

私は次のようにクラスを作りました:

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

しかし、解析が終了した後、リストにオブジェクトが入力されているかどうかを確認しようとしましたが、それらがnullであるというエラーが表示されます「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

クラスを自分で作成する代わりに。

適切にフォーマットされた XML スキーマを手動または Visual Studio で作成し、作成した XSD ファイルから C# クラスを生成します。

于 2012-07-05T16:51:38.213 に答える