Transaq
СБО "Transaq" => TRANSAQ Connector => Topic started 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;
}
-
Нужно смотреть под дебагом что прилетает в switch (свойство xr.Name) и долетает ли до него вообще.
-
В варианте Switch Case написанном выше в дебаге xr.Name показывает , что пустой - "None" .
Если убрать строку xr.Skip(); в default : , то начинают приходить данные в xr.Name , но вылетает ошибка : на секторе "SecCode" - исключение не обработано , метод ReadElementContentAsString не поддерживается для узлов типа EndElement. строка 1 , позиция 65 .
-
В варианте Switch Case написанном выше в дебаге xr.Name показывает , что пустой - "None" .
Если убрать строку xr.Skip(); в default : , то начинают приходить данные в xr.Name , но вылетает ошибка : на секторе "SecCode" - исключение не обработано , метод ReadElementContentAsString не поддерживается для узлов типа EndElement. строка 1 , позиция 65 .
навскидку у вас метод Read в while зачитал завершающий тэг элемента, а секция (section == "ticks") берется из предыдущей итерации, поэтому и получается вызов ReadElementContentAsString на EndElement. Строки у вас обнуляются хаотично, при обработке завершающего тэга у вас закомментарена очистка строк:
if (xr.NodeType == XmlNodeType.EndElement)
{
//line = "";
//section = "";
}
Надо задампить блок xml, на котором получаете исключение и прогнать его по шагам в дебаге, если явно ошибки в коде не видно.