Требуется совет по парсингу XML документов - C#

Узнай цену своей работы

Формулировка задачи:

Есть вот такой код
 string a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31,a32,a33;
         string w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15, w16, w17, w18, w19, w20, w21, w22, w23, w24, w25, w26, w27, w28, w29, w30, w31, w32,w33;
        public void parsxml()
        {
            XDocument xmldoc = XDocument.Load("http://192.168.5.65:8080/opt/out");
            XElement a = xmldoc.Element("A");
            string[] mass1 = a.Elements("url").Select(x => x.Value).ToArray();
            for (int b = 0; b < mass1.Length; b++)
            {
                try
                {
                  
                XDocument el = XDocument.Load(mass1[b]);
                var namespaces = new XmlNamespaceManager(new NameTable());
                namespaces.AddNamespace("wb", "http://fsrar.ru/WEGAIS/TTNSingle");
                namespaces.AddNamespace("pref", "http://fsrar.ru/WEGAIS/ProductRef");
                namespaces.AddNamespace("oref", "http://fsrar.ru/WEGAIS/ClientRef");
                namespaces.AddNamespace("ns", "http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01");
                namespaces.AddNamespace("iab", "http://fsrar.ru/WEGAIS/ActInventoryABInfo");
                var Owner = el.XPathSelectElements("/ns:Documents/ns:Owner/ns:FSRAR_ID", namespaces);
                var DocumentType = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Header/wb:Type", namespaces);
                var identity = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Identity", namespaces);
                var ClientRegId = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Header/wb:Shipper/oref:ClientRegId", namespaces);
                var sender1 = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Header/wb:Shipper/oref:FullName", namespaces);
                var sender2 = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Header/wb:Shipper/oref:ShortName", namespaces);
                var senderinn = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Header/wb:Shipper/oref:INN", namespaces);
                var senderkpp = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Header/wb:Shipper/oref:KPP", namespaces);
                var RegionCode = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Header/wb:Shipper/oref:address/oref:RegionCode", namespaces);
                var description = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Header/wb:Shipper/oref:address/oref:description", namespaces);
                var ClientRegId1 = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Header/wb:Consignee/oref:ClientRegId", namespaces);
                var recipient = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Header/wb:Consignee/oref:FullName", namespaces);
                var recipient1 = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Header/wb:Consignee/oref:ShortName", namespaces);
                var recipientinn = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Header/wb:Consignee/oref:INN", namespaces);
                var recipientRegionCode = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Header/wb:Consignee/oref:address/oref:RegionCode", namespaces);
                var recipientdescription = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Header/wb:Consignee/oref:address/oref:description", namespaces);
                var productstype = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Content/wb:Position/wb:Product/pref:Type", namespaces);
                string[] products = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Content/wb:Position/wb:Product/pref:FullName", namespaces).Select(x => x.Value).ToArray();
                var products2 = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Content/wb:Position/wb:Product/pref:FullName", namespaces);
                var products1 = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Content/wb:Position/wb:Product/pref:ShortName", namespaces);
                var AlcCode = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Content/wb:Position/wb:Product/pref:AlcCode", namespaces);
                var Capacity = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Content/wb:Position/wb:Product/pref:Capacity", namespaces);
                var AlcVolume = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Content/wb:Position/wb:Product/pref:AlcVolume", namespaces);
                var ClientRegId3 = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Content/wb:Position/wb:Product/pref:Producer/oref:ClientRegId", namespaces);
                var manufacturer = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Content/wb:Position/wb:Product/pref:Producer/oref:FullName", namespaces);
                var manufacturer1 = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Content/wb:Position/wb:Product/pref:Producer/oref:ShortName", namespaces);
                var manufacturerinn = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Content/wb:Position/wb:Product/pref:Producer/oref:INN", namespaces);
                var manufacturerkpp = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Content/wb:Position/wb:Product/pref:Producer/oref:KPP", namespaces);
                var manufacturerRegionCode = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Content/wb:Position/wb:Product/pref:Producer/oref:address/oref:RegionCode", namespaces);
                var manufacturerdescription = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Content/wb:Position/wb:Product/pref:Producer/oref:address/oref:description", namespaces);
                var ProductVCode = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Content/wb:Position/wb:Product/pref:ProductVCode", namespaces);
                var quantity = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Content/wb:Position/wb:Quantity", namespaces);
                var price_for_one = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Content/wb:Position/wb:Price", namespaces);
                string[] identity1 = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Content/wb:Position/wb:Identity", namespaces).Select(x => x.Value).ToArray();
                var identity2 = el.XPathSelectElements("/ns:Documents/ns:Document/ns:WayBill/wb:Content/wb:Position/wb:Identity", namespaces);
                    foreach (XElement o in Owner)
                    {
                        a33 = o.Value;
                    }
                    foreach (XElement ht in DocumentType)
                    {
                        a32 = ht.Value;
                    }
                    foreach (XElement id in identity)
                    {
 
                        a1 = id.Value;
                    }
                    foreach (XElement cri in ClientRegId)
                    {
 
                        a2 = cri.Value;
                    }
                    foreach (XElement s1 in sender1)
                    {
 
                        a3 = s1.Value;
                    }
                    foreach (XElement s2 in sender2)
                    {
 
                        a4 = s2.Value;
                    }
                    foreach (XElement si in senderinn)
                    {
 
                        a5 = si.Value;
                    }
                    foreach (XElement sk in senderkpp)
                    {
 
                        a6 = sk.Value;
                    }
                    foreach (XElement rc in RegionCode)
                    {
 
                        a7 = rc.Value;
                    }
                    foreach (XElement d in description)
                    {
 
                        a8 = d.Value;
                    }
                    foreach (XElement cri1 in ClientRegId1)
                    {
 
                        a9 = cri1.Value;
                    }
                    foreach (XElement r in recipient)
                    {
 
                        a10 = r.Value;
                    }
                    foreach (XElement r1 in recipient1)
                    {
 
                        a11 = r1.Value;
                    }
                    foreach (XElement ri in recipientinn)
                    {
 
                        a12 = ri.Value;
                    }
                    foreach (XElement rr in recipientRegionCode)
                    {
 
                        a13 = rr.Value;
                    }
                    foreach (XElement rd in recipientdescription)
                    {
 
                        a14 = rd.Value;
                    }
                    foreach (XElement pt in productstype)
                    {
 
                        a15 = pt.Value;
                    }
                    foreach (XElement p in products2)
                    {
 
                        a16 = p.Value;
                    }
                    foreach (XElement p1 in products1)
                    {
 
                        a17 = p1.Value;
                    }
                    foreach (XElement ac in AlcCode)
                    {
 
                        a18 = ac.Value;
                    }
                    foreach (XElement c in Capacity)
                    {
 
                        a19 = c.Value;
                    }
                    foreach (XElement av in AlcVolume)
                    {
 
                        a20 = av.Value;
                    }
                    foreach (XElement cri3 in ClientRegId3)
                    {
 
                        a21 = cri3.Value;
                    }
                    foreach (XElement m in manufacturer)
                    {
 
                        a22 = m.Value;
                    }
                    foreach (XElement m1 in manufacturer1)
                    {
 
                        a23 = m1.Value;
                    }
                    foreach (XElement mi in manufacturerinn)
                    {
 
                        a24 = mi.Value;
                    }
                    foreach (XElement mk in manufacturerkpp)
                    {
 
                        a25 = mk.Value;
                    }
                    foreach (XElement mr in manufacturerRegionCode)
                    {
 
                        a26 = mr.Value;
                    }
                    foreach (XElement md in manufacturerdescription)
                    {

                        a27 = md.Value;
                    }
                    foreach (XElement pvc in ProductVCode)
                    {
 
                        a28 = pvc.Value;
                    }
 
                    foreach (XElement q in quantity)
                    {

                        a29 = q.Value;
                    }
                    foreach (XElement pfo in price_for_one)
                    {

                        a30 = pfo.Value;
                    }
                    foreach (XElement i1 in identity2)
                    {
                        a31 = i1.Value;
                    }
                    SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\freeopt.mdf;Integrated Security=True");
                    conn.Open();
                    //for (int y = 0; y < products.Length; y++)
                    //{
                    for (int q = 0; q < identity1.Length; q++)
                    {
                        //dataGridView1.Rows.Add(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, products[i], a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30);
                        string command = @"INSERT INTO egais(Documents_Owner_FSRAR_ID,Documents_Document_WayBill_Identity,Documents_Document_WayBill_Header_Type,Documents_Document_WayBill_Header_Shiper_ClientRegId,Documents_Document_WayBill_Header_Shiper_FullName,Documents_Document_WayBill_Header_Shiper_ShortName,Documents_Document_WayBill_Header_Shiper_INN,Documents_Document_WayBill_Header_Shiper_KPP,Documents_Document_WayBill_Header_Shiper_address_RegionCode,Documents_Document_WayBill_Header_Shiper_address_descriprion,Documents_Document_WayBill_Header_Consignee_ClientRegId,Documents_Document_WayBill_Header_Consignee_FullName,Documents_Document_WayBill_Header_Consignee_ShortName,Documents_Document_WayBill_Header_Consignee_INN,Documents_Document_WayBill_Header_Consignee_address_RegionCode,Documents_Document_WayBill_Header_Consignee_address_description,Documents_Document_WayBill_Content_Positon_Product_Type,Documents_Document_WayBill_Content_Positon_Product_FullName,Documents_Document_WayBill_Content_Positon_Product_ShortName,Documents_Document_WayBill_Content_Positon_Product_AlcCode,Documents_Document_WayBill_Content_Positon_Product_Capacity,Documents_Document_WayBill_Content_Positon_Product_AlcVolume,Producer_ClientRegId,Producer_FullName,Producer_ShortName,Producer_INN,Producer_KPP,Producer_address_RegionCode,Producer_address_description,Documents_Document_WayBill_Content_Positon_Product_ProductVCode,Documents_Document_WayBill_Content_Positon_Quantity,Documents_Document_WayBill_Content_Positon_Product_Price,Documents_Document_WayBill_Content_Positon_Product_Identity)
                            VALUES(N'" + a33 + "',N'" + a32 + "',N'" + a1 + "',N'" + a2 + "',N'" + a3 + "',N'" + a4 + "',N'" + a5 + "',N'" + a6 + "',N'" + a7 + "',N'" + a8 + "',N'" + a9 + "',N'" + a10 + "',N'" + a11 + "',N'" + a12 + "',N'" + a13 + "',N'" + a14 + "',N'" + a15 + "'," +
                    "N'" + a16 + "',N'" + a17 + "',N'" + a18 + "',N'" + a19 + "',N'" + a20 + "',N'" + a21 + "',N'" + a22 + "',N'" + a23 + "',N'" + a24 + "',N'" + a25 + "',N'" + a26 + "',N'" + a27 + "',N'" + a28 + "',N'" + a29 + "',N'" + a30 + "',N'" + a31 + "')";
                        SqlCommand cmd = new SqlCommand(command, conn);
                        cmd.ExecuteNonQuery();
                    }
                    //}
                    conn.Close();
                    string connstr = "Server=192.168.5.155;Uid=freeopt.ru;Pwd=7igwhqdhfS;Database=freeopt;CharSet=utf8mb4";
                    MySqlConnection mysql = new MySqlConnection(connstr);
                    using (MySqlCommand cmdc = new MySqlCommand("SELECT COUNT(*) FROM egais WHERE Documents_Document_WayBill_Identity = '" + a1 + "'  ", mysql))
                    {
                        mysql.Open();
                        int counts = Convert.ToInt32(cmdc.ExecuteScalar());
                        if (counts == 0)
                        {
                            for (int z = 0; z < products.Length; z++)
                            {
 
                                string sql = @"INSERT INTO egais(Documents_Owner_FSRAR_ID,Documents_Document_WayBill_Identity,Documents_Document_WayBill_Header_Type,Documents_Document_WayBill_Header_Shiper_ClientRegId,Documents_Document_WayBill_Header_Shiper_FullName,Documents_Document_WayBill_Header_Shiper_ShortName,Documents_Document_WayBill_Header_Shiper_INN,Documents_Document_WayBill_Header_Shiper_KPP,Documents_Document_WayBill_Header_Shiper_address_RegionCode,Documents_Document_WayBill_Header_Shiper_address_descriprion,Documents_Document_WayBill_Header_Consignee_ClientRegId,Documents_Document_WayBill_Header_Consignee_FullName,Documents_Document_WayBill_Header_Consignee_ShortName,Documents_Document_WayBill_Header_Consignee_INN,Documents_Document_WayBill_Header_Consignee_address_RegionCode,Documents_Document_WayBill_Header_Consignee_address_description,Documents_Document_WayBill_Content_Positon_Product_Type,Documents_Document_WayBill_Content_Positon_Product_FullName,Documents_Document_WayBill_Content_Positon_Product_ShortName,Documents_Document_WayBill_Content_Positon_Product_AlcCode,Documents_Document_WayBill_Content_Positon_Product_Capacity,Documents_Document_WayBill_Content_Positon_Product_AlcVolume,Producer_ClientRegId,Producer_FullName,Producer_ShortName,Producer_INN,Producer_KPP,Producer_address_RegionCode,Producer_address_description,Documents_Document_WayBill_Content_Positon_Product_ProductVCode,Documents_Document_WayBill_Content_Positon_Quantity,Documents_Document_WayBill_Content_Positon_Product_Price,Documents_Document_WayBill_Content_Positon_Product_Identity)
                                    VALUES('" + a33 + "','" + a32 + "','" + a1 + "','" + a2 + "','" + a3 + "','" + a4 + "','" + a5 + "','" + a6 + "','" + a7 + "','" + a8 + "','" + a9 + "','" + a10 + "','" + a11 + "','" + a12 + "','" + a13 + "','" + a14 + "','" + a15 + "'," +
                            "'" + products[z] + "','" + a17 + "','" + a18 + "','" + a19 + "','" + a20 + "','" + a21 + "','" + a22 + "','" + a23 + "','" + a24 + "','" + a25 + "'," +
                            "'" + a26 + "','" + a27 + "','" + a28 + "','" + a29 + "','" + a30 + "','" + a31 + "')";
                                MySqlCommand cmd = new MySqlCommand(sql, mysql);
                                cmd.ExecuteNonQuery();
 
                            }
                            //  }
 
                        }
                        mysql.Close();
                    }
                }
                catch
                {
                    continue;
                }
 
            }
Это так сказать парсер, берет xml файл вытаскивает нужную нам инфо и закидывает в бд. Но вот в чем дело, если файл с другой разметкой, буквально разница в одном теге, приходиться делать все по новому. То есть код дублируем с изменением XPath, и переменных. Да все работает, но вопрос в том как можно сократить код.

Решение задачи: «Требуется совет по парсингу XML документов»

textual
Листинг программы
XDocument xmldoc = XDocument.Load("http://192.168.5.65:8080/opt/out");
            XElement a = xmldoc.Element("A");
            string[] mass1 = a.Elements("url").Select(x => x.Value).ToArray();
            for (int i = 0; i < mass1.Length; i++)
            {
                WebClient wc = new WebClient();
                using (Stream s = wc.OpenRead(mass1[i]))
                {
 
                    XmlSerializer formatter = new XmlSerializer(typeof(Producer[]));
                    Producer[] newPerson = (Producer[])formatter.Deserialize(s);
                    foreach (Producer d in newPerson)
                        listBox2.Items.Add(d);
                }
                break;
            }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.818 из 5