I am very new to XML parsing and I started to learn linq, which I think might be the best solution here. I'm more interested in performance, because the application I create will read stock prices, which can sometimes change very quickly. I get the following message from the server:
<?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>
My goal is to analyze the elements of the price category
<pricePoint> <price>1358.2</price> <quantity>20</quantity> </pricePoint>
into the dictionary of the following structure:
Dictionary<double, PriceLevel>
where the price should be double, and PriceLevel - class
class PriceLevel { int bid; int offer; public PriceLevel(int b, int o) { bid = b; offer = o; } }
Depending on the element in which each price point exists (or bids or offers), the quantity must be assigned accordingly, that is, if there is a price point in the bids, then the quantity must be assigned for the bid and 0 for the offer. In contrast, if there is a price point in offers, then a quantity must be assigned for the offer and 0 for the bid.
I hope that my explanations are clear, but if you have any problems understanding this issue, please feel free to ask for clarification in the comments. I would really appreciate help in solving this problem.
++++++++++++++++++++++++++++++++++++++++++++ Update:
I delved into the stream that I am trying to read, and it will not be as simple as I expected. I found out that the stream will not always contain the entire document, so I will have to read it using XmlReader to process the stream continuously. In this case, how can I read bids and offers? I have something like this:
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)); } } }
but I'm struggling to associate the element name with its value ... i.e. How can I find out what point of the price of the offer I am reading, and if it exists in bids or offers? Thank you for your help.