Soy muy nuevo en el análisis XML y comencé a aprender sobre linq, que creo que podría ser la mejor solución aquí. Estoy muy interesado en el rendimiento ya que la aplicación que estoy creando leerá los precios de las bolsas de valores, que a veces pueden cambiar muy rápidamente. que recibir mensaje desde el servidor:¿Cuál es la forma más rápida/más eficiente de leer este XML en el diccionario (Linq u otra cosa?)
<?xml version="1.0" encoding="utf-16"?>
<events>
<header>
<seq>0</seq>
</header>
<body>
<orderBookStatus>
<id>100093</id>
<status>Opened</status>
</orderBookStatus>
<orderBook>
<instrumentId>100093</instrumentId>
<bids>
<pricePoint>
<price>1357.1</price>
<quantity>20</quantity>
</pricePoint>
<pricePoint>
<price>1357.0</price>
<quantity>20</quantity>
</pricePoint>
<pricePoint>
<price>1356.9</price>
<quantity>71</quantity>
</pricePoint>
<pricePoint>
<price>1356.8</price>
<quantity>20</quantity>
</pricePoint>
</bids>
<offers>
<pricePoint>
<price>1357.7</price>
<quantity>51</quantity>
</pricePoint>
<pricePoint>
<price>1357.9</price>
<quantity>20</quantity>
</pricePoint>
<pricePoint>
<price>1358.0</price>
<quantity>20</quantity>
</pricePoint>
<pricePoint>
<price>1358.1</price>
<quantity>20</quantity>
</pricePoint>
<pricePoint>
<price>1358.2</price>
<quantity>20</quantity>
</pricePoint>
</offers>
<lastMarketClosePrice>
<price>1356.8</price>
<timestamp>2011-05-03T20:00:00</timestamp>
</lastMarketClosePrice>
<dailyHighestTradedPrice />
<dailyLowestTradedPrice />
<valuationBidPrice>1357.1</valuationBidPrice>
<valuationAskPrice>1357.7</valuationAskPrice>
<lastTradedPrice>1328.1</lastTradedPrice>
<exchangeTimestamp>1304501070802</exchangeTimestamp>
</orderBook>
</body>
</events>
Mi objetivo es analizar los elementos puntuales precio
<pricePoint>
<price>1358.2</price>
<quantity>20</quantity>
</pricePoint>
en el diccionario de la siguiente estructura:
Dictionary<double, PriceLevel>
donde el precio debería ser una double y PriceLevel es una clase
class PriceLevel
{
int bid;
int offer;
public PriceLevel(int b, int o)
{
bid = b;
offer = o;
}
}
Dependiendo del elemento, en el que cada punto de precio exista (ofertas o ofertas) la cantidad debe asignarse en consecuencia, es decir, si el precio existe en ofertas, entonces la cantidad debe asignarse a la oferta y 0 ofrecerse. Por el contrario, si el punto de precio existe en las ofertas, entonces la cantidad debe asignarse a la oferta y 0 a la oferta.
Espero que mi explicación sea clara; sin embargo, si tiene algún problema para comprenderla, no dude en solicitar una aclaración en los comentarios. Agradecería mucho ayuda para resolver este problema.
+++++++++++++++++++++++++++++++++++++++++ Actualización:
He profundizado en la transmisión que trato de leer, y no va a ser tan simple como esperaba. Descubrí que la transmisión no siempre contiene el documento completo, por lo tanto, tendré que leerlo con XmlReader para procesar la transmisión continuamente. En este caso, ¿cómo puedo leer ofertas y ofertas? Tengo algo como esto:
StreamReader sr = new StreamReader (".. \ .. \ videos.xml");
XmlReader xmlReader = XmlReader.Create(sr);
while (xmlReader.Read())
{
if (xmlReader.HasValue)
{
OnXmlValue(this, new MessageEventArgs(true, xmlReader.Value));//saxContentHandler.Content(xmlReader.Value);
}
else
{
if (xmlReader.IsEmptyElement)
{
OnStartElement(this, new MessageEventArgs(false, xmlReader.Name));
OnEndElement(this, new MessageEventArgs(false, xmlReader.Name));
}
else if (xmlReader.IsStartElement())
{
OnStartElement(this, new MessageEventArgs(false, xmlReader.Name));
}
else
{
OnEndElement(this, new MessageEventArgs(false, xmlReader.Name));
}
}
}
pero estoy luchando para enlazar nombre del elemento a su valor ... es decir, ¿cómo puedo saber qué punto de precio de la oferta que estoy leyendo actualmente y si este existe en licitaciones u ofertas? Gracias por su ayuda
¿Cuál es la precisión máxima de su punto de precio? los tiene todos con 1 lugar decimal, con 4 dígitos antes del dp, en su ejemplo. ¿Es así como será para todos sus puntos de precio? –
¿Qué tan rápido debe ser el más rápido? Segundos, milisegundos, microsegundos? – Ishtar
Creo que esa precisión máxima de 6 decimales debería ser suficiente. en cuanto a la velocidad y el rendimiento, habrá muchos mensajes similares por segundo, así que estoy hablando de milisegundos al menos;) – Macin