Содержание блога

четверг, 17 июня 2010 г.

Чтение XML Кода

Имеется код в формате XML нужно его перегнать в список
Пример XML
<datagetway act="getcavelist">
 <info> datagetway ver 1.0 act=getcavelist</info>
 <caves> 
  <cave cavename="п.Камызякская" datecrt="0" dateupd="0" id="2"> 
   <cavedesc>Очень красивая пещера.</cavedesc> 
   <sessions> 
    <session datecrt="0" dateupd="0" id="2" isused="0" sessionname="KAMIZAK"> 
     <sessiondesc>Длина: 272
      Глубина: 74</sessiondesc> 
    </session> 
   </sessions> 
  </cave> 
  <cave cavename="п.Пять Озер" datecrt="0" dateupd="0" id="1"> 
   <cavedesc>Пещера еще до конца не изучена.</cavedesc> 
   <sessions> 
    <session datecrt="0" dateupd="0" id="1" isused="0" sessionname="FLIKE1"> 
      <sessiondesc>Длина:     811
      Глубина: 57</sessiondesc> 
    </session> 
   </sessions> 
  </cave> 
</caves> 
</datagetway>

Код обработчика:
string sResult = e.Result.Trim(); // текст в формате XML
            StringReader stream = new StringReader(sResult);
            XmlReader reader = XmlReader.Create((TextReader)stream);
            string act = "";
            string info = "", node = "", nodecv = "", nodecv2 = "", nodecv3 = "";
            #region Пример XML
            //<?xml version="1.0" encoding="utf-8" ?> 
            //<datagetway act="getcavelist" >
            //<info> datagetway ver 1.0 act=getcavelist</info>
            //<caves> 
            //    <cave id="2" cavename="п.Камызякская" datecrt="0" dateupd="0"> 
            //        <cavedesc>Очень красивая пещера.</cavedesc> 
            //        <sessions> 
            //            <session id="2" sessionname="KAMIZAK" datecrt="0" dateupd="0" isused="0"> 
            //                <sessiondesc></sessiondesc> 
            //            </session> 
            //        </sessions> 
            //    </cave> 
            //    <cave id="1" cavename="п.Пять Озер" datecrt="0" dateupd="0"> 
            //        <cavedesc>Пещера еще до конца не изучена.</cavedesc> 
            //        <sessions> 
            //            <session id="1" sessionname="FLIKE1" datecrt="0" dateupd="0" isused="0"> 
            //               <sessiondesc></sessiondesc> 
            //            </session> 
            //        </sessions> 
            //    </cave> 
            //</caves> 
            //</datagetway>
            #endregion Пример XML
            cavelist = new List<Caves>();
            Caves cv = new Caves();
            SessionCave ssc = new SessionCave();
            int cvint = -1, sscint = -1;
            List<PiketListItem> listPk = new List<PiketListItem>(); // Журнал пикетажки
            PiketListItem itemPk = new PiketListItem(); //строка-пикет
            #region Чтение XML
            while (reader.Read())//Чтение XML
            {

                //textBoxLog.Text += "XML Read " + reader.Name + "; cvint=" + cvint.ToString() + "\r\n";
                #region NodeType == Element
                if (reader.NodeType == XmlNodeType.Element) //Если элемент 
                {
                    #region datagetway
                    if (reader.Name == "datagetway")
                    {
                        act = reader.GetAttribute("act");
                        textBoxLog.Text += "XML datagetway act = " + act + "\r\n";
                    }
                    #endregion datagetway
                    #region info
                    else if (reader.Name == "info")
                    {
                        node = reader.Name;
                    }
                    #endregion info
                    #region caves
                    else if (reader.Name == "caves")
                    {
                        node = "caves";
                        textBoxLog.Text += "XML node = " + node + "\r\n";
                    }
                    #region cave
                    else if (reader.Name == "cave" && node == "caves")
                    {
                        nodecv = reader.Name;
                        cv = new Caves();
                        cv.id = Convert.ToInt32(reader.GetAttribute("id"));
                        cv.cavename = reader.GetAttribute("cavename");
                        cv.datecrt = reader.GetAttribute("datecrt");
                        cv.dateupd = reader.GetAttribute("dateupd");
                        cavelist.Add(cv);
                        cvint = cavelist.Count - 1;
                        textBoxLog.Text += "XML nodecv = " + nodecv + "\r\n";
                    }
                    #region cavedesc
                    else if (reader.Name == "cavedesc" && node == "caves" && nodecv == "cave")
                    {
                        nodecv2 = reader.Name;
                    }
                    #endregion cavedesc
                    #region sessions
                    else if (reader.Name == "sessions" && node == "caves" && nodecv == "cave")
                    {
                        nodecv2 = reader.Name;
                        cavelist[cvint].sessions = new List<SessionCave>();
                    }
                    #region session
                    else if (reader.Name == "session" && node == "caves" && nodecv == "cave" && nodecv2 == "sessions")
                    {
                        ssc = new SessionCave();
                        ssc.id = Convert.ToInt32(reader.GetAttribute("id"));
                        ssc.name = reader.GetAttribute("sessionname");
                        ssc.datecrt = reader.GetAttribute("datecrt");
                        ssc.dateupd = reader.GetAttribute("dateupd");
                        ssc.isused = reader.GetAttribute("isused");
                        cavelist[cvint].sessions.Add(ssc);
                        textBoxLog.Text += "XML session = " + ssc.name + "\r\n";
                        sscint = cavelist[cvint].sessions.Count - 1;
                    }
                    #region sessiondesc
                    else if (reader.Name == "sessiondesc" && node == "caves" && nodecv == "cave" && nodecv2 == "sessions")
                    {
                        nodecv3 = reader.Name;
                    }
                    #endregion sessiondesc

                    #endregion session
                    #endregion sessions

                    #endregion cave
                    #endregion caves
                    #region addpiket
                    if (reader.Name == "addpiket")
                    {
                        string sblockid = reader.GetAttribute("blockid");
                        string sact = reader.GetAttribute("act");
                        int noBl = -1;
                        int i = -1;
                        foreach (BlockGet bl in blocks)
                        {
                            i++;
                            if (bl.blockId == sblockid) noBl = i;
                        }
                        if (noBl > -1)
                            blocks.RemoveAt(noBl);
                        textBoxLog.Text += "осталось блоков:" + blocks.Count;
                        if (blocks.Count == 0)
                        {
                            Uri uri;
                            WebClient wc;
                            uri = new Uri(getwayURL.Text + "?act=commitpkt&sessionid=" + sessionID, UriKind.Absolute);

                            wc = new WebClient();
                            textBoxLog.Text += "DownloadStringCompleted... commit" + "\r\n";
                            wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(DownloadStringCompletedHndlr);
                            textBoxLog.Text += "DownloadStringAsync... \r\n";
                            wc.DownloadStringAsync(uri, "POST");
                        }
                    }
                    #endregion addpiket
                    #region addpiketxml
                    if (reader.Name == "addpiketxml")
                    {
                        string sblockid = reader.GetAttribute("blockid");
                        string sact = reader.GetAttribute("act");
                        int noBl = -1;
                        int i = -1;
                        foreach (BlockGet bl in blockXML)
                        {
                            i++;
                            if (bl.blockId == sblockid) noBl = i;
                        }
                        if (noBl > -1)
                            blockXML.RemoveAt(noBl);
                        textBoxLog.Text += "осталось блоков:" + blockXML.Count;
                        if (blockXML.Count == 0)
                        {
                            Uri uri;
                            WebClient wc;
                            uri = new Uri(getwayURL.Text + "?act=commitpkt&sessionid=" + sessionID, UriKind.Absolute);

                            wc = new WebClient();
                            textBoxLog.Text += "DownloadStringCompleted... commit" + "\r\n";
                            wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(DownloadStringCompletedHndlr);
                            textBoxLog.Text += "DownloadStringAsync... \r\n";
                            wc.DownloadStringAsync(uri, "POST");
                        }
                    }
                    #endregion addpiketxml
                    #region addstationxml
                    if (reader.Name == "addstationxml")
                    {
                        string sblockid = reader.GetAttribute("blockid");
                        string sact = reader.GetAttribute("act");
                        int noBl = -1;
                        int i = -1;
                        foreach (BlockGet bl in blockStsXML)
                        {
                            i++;
                            if (bl.blockId == sblockid) noBl = i;
                        }
                        if (noBl > -1)
                            blockStsXML.RemoveAt(noBl);
                        textBoxLog.Text += "осталось блоков:" + blockStsXML.Count;
                        if (blockStsXML.Count == 0)
                        {
                            Uri uri;
                            WebClient wc;
                            uri = new Uri(getwayURL.Text + "?act=commitsts&sessionid=" + sessionID, UriKind.Absolute);

                            wc = new WebClient();
                            textBoxLog.Text += "DownloadStringCompleted... commit" + "\r\n";
                            wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(DownloadStringCompletedHndlr);
                            textBoxLog.Text += "DownloadStringAsync... \r\n";
                            wc.DownloadStringAsync(uri, "POST");
                        }
                    }
                    #endregion addstationxml
                    #region commitpiket
                    if (reader.Name == "commitpiket")
                    {
                        textBoxLog.Text += "COMMIT PICKET";
                        textBlockStat.Text = "Данные переданы";
                        textBlockStat.Text = "Передача станций ... дождитесь завершения";
                        SendXMLSTS();
                    }
                    #endregion commitpiket
                    #region commitstation
                    if (reader.Name == "commitstation")
                    {
                        textBoxLog.Text += "COMMIT STATIONS";
                        textBlockStat.Text = "Данные о станциях переданы";
                    }
                    #endregion commitstation
                    #region delallwppktbf
                    if (reader.Name == "delallwppktbf")
                    {
                        textBoxLog.Text += "Готов к приему";
                        SendXML();
                    }
                    #endregion delallwppktbf
                    #region commitcave
                    if (reader.Name == "commitcave")
                    {
                        textBoxLog.Text += "COMMIT cave";
                        textBlockStat.Text = "Создана пещера";
                        refreshCave();
                    }
                    #endregion commitcave
                    #region commitsession
                    if (reader.Name == "commitsession")
                    {
                        textBoxLog.Text += "commit session";
                        textBlockStat.Text = "Создана сессия";
                        refreshCave();
                    }
                    #endregion commitsession
                    #region pktlist
                    else if (reader.Name == "pktlist")
                    {
                        node = "pktlist";
                        textBoxLog.Text += "XML node = " + node + "\r\n";
                        listPk = new List<PiketListItem>();
                    }
                    #region pkt
                    else if (reader.Name == "pkt" && node == "pktlist")
                    {
                        nodecv = "pkt";
                        //<pkt id="17" sessionID="2" p_FROM="10" p_TO="11" p_AZIMUT="156,00" p_INC="32,00" p_LENGTH="8,20"  
                        //p_LEFT="2,30" p_UP="2,95" p_DOWN="0,00" p_RIGHT="1,97"  p_sIsPiket="1" p_sIsPiketWall="1">Ступенька 0.9</pkt>
                        itemPk = new PiketListItem();
                        itemPk.ID = Convert.ToInt32(reader.GetAttribute("id"));
                        itemPk.FROM = reader.GetAttribute("p_FROM");
                        itemPk.TO = reader.GetAttribute("p_TO");
                        itemPk.BEARING = reader.GetAttribute("p_AZIMUT");
                        itemPk.INC = reader.GetAttribute("p_INC");
                        itemPk.LENGTH = reader.GetAttribute("p_LENGTH");
                        itemPk.LEFT = reader.GetAttribute("p_LEFT");
                        itemPk.UP = reader.GetAttribute("p_UP");
                        itemPk.DOWN = reader.GetAttribute("p_DOWN");
                        itemPk.RIGHT = reader.GetAttribute("p_RIGHT");
                        itemPk.IsPiket = false;
                        if (reader.GetAttribute("p_sIsPiket") == "1")
                            itemPk.IsPiket = true;
                        itemPk.IsPiketWall = false;
                        if (reader.GetAttribute("p_sIsPiketWall") == "1")
                            itemPk.IsPiketWall = true;
                        listPk.Add(itemPk);
                    }
                    #endregion pkt
                    #endregion pktlist
                }
                #endregion NodeType == Element
                #region NodeType == EndElement
                else if (reader.NodeType == XmlNodeType.EndElement)
                {
                    if (reader.Name == "cave")
                    {
                        nodecv = "";
                    }
                    if (reader.Name == "caves")
                    {
                        node = "";
                    }
                    if (reader.Name == "cavedesc")
                    {
                        nodecv2 = "";
                    }
                    if (reader.Name == "info")
                    {
                        node = "";
                    }
                    if (reader.Name == "sessiondesc")
                    {
                        nodecv3 = "";
                    }
                    if (reader.Name == "pktlist")
                    {
                        node = "";
                    }
                    if (reader.Name == "pkt")
                    {
                        nodecv = "";
                    }
                }
                #endregion NodeType == EndElement
                #region NodeType == Text
                else if (reader.NodeType == XmlNodeType.Text)
                {
                    if (node == "info")
                    {
                        info = reader.Value;
                        textBoxLog.Text += "XML info = " + info + "\r\n";
                    }
                    if (nodecv2 == "cavedesc" && node == "caves" && nodecv == "cave")
                    {
                        cavelist[cvint].cavedesc = reader.Value;
                        textBoxLog.Text += "XML cavedesc = " + cavelist[cvint].cavedesc + "\r\n";
                    }
                    if (nodecv3 == "sessiondesc" && node == "caves")
                    {
                        cavelist[cvint].sessions[sscint].desc = reader.Value;
                        textBoxLog.Text += "XML sessiondesc = " + cavelist[cvint].sessions[sscint].desc + "\r\n";
                    }
                    if (nodecv == "pkt" && node == "pktlist")
                    {
                        listPk[listPk.Count - 1].COMMENTS = reader.Value;
                        textBoxLog.Text += "XML pktComment = " + listPk[listPk.Count - 1].COMMENTS;
                    }
                }
                #endregion NodeType == Text
            }//while (reader.Read())//Чтение XML
            #endregion Чтение XML
            textBoxLog.Text += "cavelist.Count = " + cavelist.Count.ToString() + "\r\n";

Комментариев нет:

Отправить комментарий