Transaq

СБО "Transaq" => TRANSAQ Connector => Topic started by: anest on Мая 22, 2023, 02:31:12 am

Title: Парсинг данных
Post by: anest on Мая 22, 2023, 02:31:12 am
  И снова здравствуйте ! 
 Долгое время использовал для парсинга строк данных конструкцией If  , в принципе всё устраивало , но решил немного модернизировать и использовать Switch case

public void Callback(Stream stream)
        {
            string section = "";
            string line = "";
            string str = "";
            string ename = "";
            string evalue = "";
            string attr = "";

            using (XmlReader xr = XmlReader.Create(stream))
            {
                while (xr.Read())
                {
                    switch (xr.NodeType)
                    {
                        case XmlNodeType.Element:
                        case XmlNodeType.EndElement:
                            ename = xr.Name; break;
                        case XmlNodeType.Text:
                        case XmlNodeType.CDATA:
                        case XmlNodeType.Comment:
                        case XmlNodeType.XmlDeclaration:
                            evalue = xr.Value; break;
                        case XmlNodeType.DocumentType:
                            ename = xr.Name; evalue = xr.Value; break;
                        default: break;
                    }
                    //................................................................................
                    // определяем узел верхнего уровня - "секцию"
                    if (xr.Depth == 0)
                    {
                        if (xr.NodeType == XmlNodeType.Element)
                        {
                            section = ename;

                            if ((section != "boards") && (section != "securities") && (section != "pits") && (section != "sec_info_upd"))
                            {
                                //Form_AddText(textForWindow);
                                //textForWindow = "";
                            }

                            //line = "";
                            str = "";
                            for (int i = 0; i < xr.AttributeCount; i++)
                            {
                                str = str + xr.GetAttribute(i) + ";";
                            }
                        }
                        if (xr.NodeType == XmlNodeType.EndElement)
                        {
                            //line = "";
                            //section = "";
                        }
                        if (xr.NodeType == XmlNodeType.Text)
                        {
                            str = str + evalue + ";";
                        }
                    }
                    //................................................................................
                    //................................................................................
                    // данные о статусе соединения с сервером
                    if (section == "server_status")
                    {
                        if (xr.NodeType == XmlNodeType.Element)
                        {
                            line = "";
                            str = "";
                            string attr_connected = xr.GetAttribute("connected");
                            if (attr_connected == "true") bConnected = true;
                            if (attr_connected == "false") bConnected = false;

                            for (int i = 0; i < xr.AttributeCount; i++)
                            {
                                attr = xr.GetAttribute(i);
                                str = str + i.ToString() + ":<" + attr + ">;";
                            }
                            line = "set server_status: " + str;
                        }

                        VolScanForm.StatusConnect_Handler(bConnected);

                        Console.WriteLine(" bConnected = " + bConnected);
                        Console.WriteLine(" xr.AttributeCount = " + xr.AttributeCount);
                        Console.WriteLine(line);
                    }
                    //-----------------------------------------------------------------------
                    if (section == "orders") //обрабатываем заявки
                    {
                        if (!(xr.Name == "order"))
                        {


                        }
                        else
                        {
                            transactionid = xr.GetAttribute("transactionid");
                            Console.WriteLine(" transactionid = " + transactionid);
                        }
                        //----------------------------------------------------------

                        if (xr.Name == "result")
                        {
                            Result = xr.ReadElementContentAsString();
                            Console.WriteLine(" Result = " + Result);

                        }
                        if (xr.Name == "orderno")
                        {
                            OrderNo = xr.ReadElementContentAsLong();
                            Console.WriteLine(" OrderNo = " + OrderNo);
                        }
                        if (xr.Name == "balance")
                        {
                            Balance = xr.ReadElementContentAsInt();
                            Console.WriteLine(" Balance = " + Balance);
                        }
                        if (xr.Name == "status")
                        {
                            Status = xr.ReadElementContentAsString();
                            Console.WriteLine(" status = " + Status);
                        }
                        if (xr.Name == "price")
                        {
                            GetPrice = xr.ReadElementContentAsString();
                            Console.WriteLine(" GetPrice = " + GetPrice);
                        }


                    }
                    //-----------------------------------------------------------------------
                    if (section == "ticks")
                    {
                        if (xr.Name == "board")
                        {
                            Board = xr.ReadElementContentAsString();
                        }
                        if (xr.Name == "seccode")
                        {
                            SecCode = xr.ReadElementContentAsString();
                        }
                        if (xr.Name == "tradeno")
                        {
                            TradeNo = xr.ReadElementContentAsLong();
                        }
                        if (xr.Name == "tradetime")
                        {
                            TradeTime = DateTime.Parse(xr.ReadElementContentAsString());
                        }
                        if (xr.Name == "price")
                        {
                            Price = xr.ReadElementContentAsDouble();
                        }
                        if (xr.Name == "quantity")
                        {
                            Quantity = xr.ReadElementContentAsInt();
                        }
                        if (xr.Name == "buysell")
                        {
                            BuySell = xr.ReadElementContentAsString();
                        }
                        if (xr.Name == "openinterest")
                        {
                            OpenInterest = xr.ReadElementContentAsInt();
                        }
               }
            }
            Меняю на Switch Case ,  не работает , данные не считываются . Может , кто подскажет , что делаю не правильно . Break пробовал менять на Case goto , результата тоже нет .

switch (xr.Name)
            {
                case "board":
                    Board = xr.ReadElementContentAsString();
                    break;
                case "seccode":
                    SecCode = xr.ReadElementContentAsString();
                    break;
                case "tradeno":
                    TradeNo = xr.ReadElementContentAsLong();
                    break;
                case "tradetime":
                    TradeTime = DateTime.Parse(xr.ReadElementContentAsString());
                    break;
                case "price":
                    Price = xr.ReadElementContentAsDouble();
                    break;
                case "quantity":
                    Quantity = xr.ReadElementContentAsInt();
                    break;
                case "buysell":
                    BuySell = xr.ReadElementContentAsString();
                    break;
                case "openinterest":
                    OpenInterest = xr.ReadElementContentAsInt();
                    break;
                default:
                    xr.Skip();
                    break;
            }

Title: Re: Парсинг данных
Post by: Сорвачев Сергей on Мая 23, 2023, 10:14:46 am
Нужно смотреть под дебагом что прилетает в switch (свойство xr.Name) и долетает ли до него вообще.
Title: Re: Парсинг данных
Post by: anest on Мая 24, 2023, 05:48:05 am
   В варианте Switch Case написанном выше в дебаге xr.Name показывает , что пустой - "None" .
   Если убрать строку xr.Skip();  в default : , то начинают приходить данные в xr.Name , но вылетает ошибка : на секторе "SecCode" - исключение не обработано , метод ReadElementContentAsString не поддерживается для узлов типа EndElement. строка 1 , позиция 65 .
Title: Re: Парсинг данных
Post by: Сорвачев Сергей on Мая 25, 2023, 12:57:23 pm
   В варианте Switch Case написанном выше в дебаге xr.Name показывает , что пустой - "None" .
   Если убрать строку xr.Skip();  в default : , то начинают приходить данные в xr.Name , но вылетает ошибка : на секторе "SecCode" - исключение не обработано , метод ReadElementContentAsString не поддерживается для узлов типа EndElement. строка 1 , позиция 65 .

навскидку у вас метод Read в while зачитал завершающий тэг элемента, а секция (section == "ticks") берется из предыдущей итерации, поэтому и получается вызов ReadElementContentAsString  на EndElement. Строки у вас обнуляются хаотично, при обработке завершающего тэга у вас закомментарена очистка строк:
Code: [Select]
     
if (xr.NodeType == XmlNodeType.EndElement)
{
 //line = "";
 //section = "";
}

Надо задампить блок xml, на котором получаете исключение и прогнать его по шагам в дебаге, если явно ошибки в коде не видно.