Quelle est la manière la plus rapide/la plus efficace pour lire ce XML Dictionnaire de Linq (ou quelque chose d'autre?)
Je suis très nouveau à l'analyse de XML, et j'ai commencé à apprendre à propos de linq qui, je pense, la meilleure solution ici. Je suis surtout intéressé par la performance que l'application que je suis en créant va lire les cours de bourse, ce qui parfois peut changer très rapidement.
Je reçois message suivant sur le serveur:
<?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>
Mon but est d'analyser les prix des éléments
<pricePoint>
<price>1358.2</price>
<quantity>20</quantity>
</pricePoint>
dans le dictionnaire de la structure suivante:
Dictionary<double, PriceLevel>
où le prix devrait être un double et PriceLevel est une classe
class PriceLevel
{
int bid;
int offer;
public PriceLevel(int b, int o)
{
bid = b;
offer = o;
}
}
En fonction de l'élément, dans lequel chaque point de prix existant (soit des soumissions ou des offres) quantité doit être attribué en conséquence, c'est à dire si le point de prix existe dans les offres, la quantité doit être attribué à l'offre, et de 0 à offrir. À l'inverse, si le prix point existe dans l'offre, puis la quantité doit être attribué à l'offre et 0 offre.
J'espère que mon explication est claire, cependant si vous avez des problèmes de compréhension, s'il vous plaît n'hésitez pas à demander des précisions dans les commentaires.
Je vous serais très reconnaissant de l'aide dans la résolution de ce problème.
+++++++++++++++++++++++++++++++++++++++++
Mise à jour:
Je suis allé plus profondément dans le ruisseau, je suis en train de lire, et il ne va pas être aussi simple que je le pensais. J'ai découvert, que le flux ne sera pas toujours contenir l'ensemble du document, donc je vais devoir le lire en utilisant XmlReader à traiter le flux sur la base continue. Dans ce cas, comment puis-je lire les offres et les offres? J'ai quelque chose comme ceci:
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));
}
}
}
mais j'ai du mal à lier le nom de l'élément à sa valeur ... c'est à dire, comment puis-je connaître les prix de l'offre point je suis en train de lire et si c'est le cas dans les soumissions ou des offres?
Je vous remercie pour l'aide
- quel est le maximum de précision de votre point de prix? vous disposez de tous à 1 chiffre après la virgule, avec 4 chiffres avant la dp, dans votre exemple. Est-ce qu'il sera pour tous vos points de prix?
- A quelle vitesse la plus rapide doivent être? Secondes, millisecondes, microsecondes?
- Je pense qu'une précision maximale de 6 points décimaux devrait être suffisant. comme pour la vitesse et la performance, il y aura beaucoup de messages similaires par seconde pour me parler millisecondes au moins;)
- Je considère que le programmeur de l'efficacité aussi bien ici. XmlReader est le plus bas de l'API .NET, tous les autres XML Api .NET utilise dans les coulisses. C'est une API de diffusion en continu, de sorte qu'il est le plus rapide. Pour le programmeur de la productivité, je préfère Linq to XML, c'est à dire XDocument. De toute façon pour certains des chiffres bruts: altamiracorp.com/blog/employee-posts/performance-linq-to-sql-vs, blogs.msdn.com/b/codejunkie/archive/2008/10/08/...
Vous devez vous connecter pour publier un commentaire.
Quand utilisez un événement basé sur l'interface, similaire à celui présenté dans la mise à jour, vous devrez vous souvenir du nom de l'ancien élément de début de l'événement. Souvent il vaut la peine en tenant une pile de garder une trace des événements. Je serais probablement faire quelque chose de similaire à la suivante:
vous devez d'abord obtenir toutes les offres et toutes les offres
alors que vous venez de itérer throgh les offres et les offres et de les ajouter au dictionnaire... mais comme quelqu'un le sait avant de... vous aurez peut-être le problème est que une pricelevel aura à la fois des offres si elles ont le même prix
pour itérer throgugh la liste que vous venez de faire ce
le même que vous faites pour offrir... mais encore une fois.. .vous avez probablement à vérifier si cette clé existe déjà...
1er de tous, je crois que votre méthode de la mise en dictionnaire le résultat serait dans l'erreur. Si pas de mal, le dictionnaire ne peut pas avoir la même clé, alors, puisque vous êtes à l'aide de prix de la clé, il y aura de très fortes chances u appuyez sur ce problème.
Je ne peux pas dire pour la vitesse, vous devez tester. Mais jusqu'à présent, XDocument fonctionne très bien pour moi.
À l'aide de XDocument, charger la totalité du message xml dans une variable, par exemple
Avec la doc, vous pouvez utiliser Linq to groupe dans d'offre et de demande.
Une fois que vous atteindre cet objectif, il devrait y avoir aucun problème dans la présentation de vos données comme vous l'avez déjà obtenu le prix et les a séparés en d'offre et de demande
J'ai réussi à obtenir quelque chose comme ceci:
Est-ce une bonne solution pour le problème? J'ai quelques doutes au sujet de ce morceau de code:
Je n'feu OnPricePointReceived cas quand j'ai réussi à lire le prix et la quantité. Cependant, il y a la possibilité, qu'il n'y aura pas de quantité pour le prix donné (ou pas). Comment mettre en œuvre valiadation, pour éviter les erreurs de messages incomplets?