XML Help

M

Mark Cooney

OK this might be long winded by want to show you everything I am doing.

Down below is the result I get from an API Call to a website called Betfair.

The following is some code I am trying, but I have also tried many different
variations.
Dim response As HttpWebResponse = request.GetResponse()

'Get the response stream
Dim reader As StreamReader = New StreamReader(response.GetResponseStream)

Dim objDoc As New System.Xml.XmlDocument
objDoc.Load(reader)

Dim Node As XmlNode = objDoc.SelectSingleNode("/channel/status")
MsgBox(Node.Value)

I am trying to the word "RUNNING" from within line 3 of the call but instead
I am getting NullReferenceException.
I want to keep my code as simple as possible and I will want to pull other
information such as the id attribute from line 4 of the call.

Can anyone help?
MC


API Call Returns the following:
<channelSnapshot>
<channel gameType="POKER" id="1444074" name="Exchange Poker Texas
Hold'em">
<status>RUNNING</status>
<game id="1817283">
<round>3</round>
<bettingWindowTime>45</bettingWindowTime>
<bettingWindowPercentageComplete>24</bettingWindowPercentageComplete>
<gameData>
<object name="Hand 1">
<description>One Pair, Fours, Ace High,
with Q, 8 Kickers</description>
<status>IN_PLAY</status>
<property name="Card 1" value="20"/>
<property name="Card 2" value="29"/>
</object>
<object name="Hand 2">
<description>One Pair, Sixes, Ace
High</description>
<status>IN_PLAY</status>
<property name="Card 1" value="5"/>
<property name="Card 2" value="44"/>
</object>
<object name="Hand 3">
<description>One Pair, Fours, Ace High,
with Q, 6 Kickers</description>
<status>IN_PLAY</status>
<property name="Card 1" value="31"/>
<property name="Card 2" value="42"/>
</object>
<object name="Hand 4">
<description>Ace High</description>
<status>IN_PLAY</status>
<property name="Card 1" value="49"/>
<property name="Card 2" value="45"/>
</object>
<object name="Community Cards">
<description/>
<status>N/A</status>
<property name="Card 1" value="3"/>
<property name="Card 2" value="13"/>
<property name="Card 3" value="11"/>
<property name="Card 4" value="NOT
AVAILABLE"/>
<property name="Card 5" value="NOT
AVAILABLE"/>
</object>
</gameData>
<markets currency="GBP">
<market id="5615051">
<status>ACTIVE</status>
<commissionRate>2.5</commissionRate>
<marketType>WIN_ONLY</marketType>
<selections type="MainBets">
<selection id="658439">
<name>Hand 1</name>
<resource
href="https://api.games.betfair.com/rest/v1/selection/tradeActivity?marketId=5615051&selectionId=658439"
responseType="selectionTradeActivity" title="Trade Activity"/>
<status>IN_PLAY</status>
<amountMatched>22.74</amountMatched>
<bestAvailableToBackPrices>
<price
amountUnmatched="204.42">6.6</price>
<price
amountUnmatched="381.64">6.55</price>
<price
amountUnmatched="576.92">6.5</price>
</bestAvailableToBackPrices>
<bestAvailableToLayPrices>
<price
amountUnmatched="74.6">6.7</price>
<price
amountUnmatched="504.74">6.75</price>
<price
amountUnmatched="551.44">6.8</price>
</bestAvailableToLayPrices>
</selection>
<selection id="658440">
<name>Hand 2</name>
<resource
href="https://api.games.betfair.com/rest/v1/selection/tradeActivity?marketId=5615051&selectionId=658440"
responseType="selectionTradeActivity" title="Trade Activity"/>
<status>IN_PLAY</status>
<amountMatched>88.68</amountMatched>
<bestAvailableToBackPrices>
<price
amountUnmatched="306.66">1.72</price>
<price
amountUnmatched="4127.36">1.71</price>
<price
amountUnmatched="59.63">1.7</price>
</bestAvailableToBackPrices>
<bestAvailableToLayPrices>
<price
amountUnmatched="99.98">1.73</price>
<price
amountUnmatched="2188.96">1.74</price>
<price
amountUnmatched="2200.77">1.75</price>
</bestAvailableToLayPrices>
</selection>
<selection id="658441">
<name>Hand 3</name>
<resource
href="https://api.games.betfair.com/rest/v1/selection/tradeActivity?marketId=5615051&selectionId=658441"
responseType="selectionTradeActivity" title="Trade Activity"/>
<status>IN_PLAY</status>
<amountMatched>102.9</amountMatched>
<bestAvailableToBackPrices>
<price
amountUnmatched="17.99">45.0</price>
<price
amountUnmatched="140.4">44.5</price>
<price
amountUnmatched="2.19">44.0</price>
</bestAvailableToBackPrices>
<bestAvailableToLayPrices>
<price
amountUnmatched="33.52">46.0</price>
<price
amountUnmatched="53.76">46.5</price>
<price
amountUnmatched="79.76">47.0</price>
</bestAvailableToLayPrices>
</selection>
<selection id="658442">
<name>Hand 4</name>
<resource
href="https://api.games.betfair.com/rest/v1/selection/tradeActivity?marketId=5615051&selectionId=658442"
responseType="selectionTradeActivity" title="Trade Activity"/>
<status>IN_PLAY</status>
<amountMatched>1020.0</amountMatched>
<bestAvailableToBackPrices>
<price
amountUnmatched="158.07">4.0</price>
<price
amountUnmatched="198.19">3.98</price>
<price
amountUnmatched="631.28">3.96</price>
</bestAvailableToBackPrices>
<bestAvailableToLayPrices>
<price
amountUnmatched="103.84">4.06</price>
<price
amountUnmatched="612.72">4.08</price>
<price
amountUnmatched="914.6">4.1</price>
</bestAvailableToLayPrices>
</selection>
</selections>
</market>
</markets>
</game>
</channel>
</channelSnapshot>
 
S

Stephany Young

Your:

Dim Node As XmlNode = objDoc.SelectSingleNode("/channel/status")

is the issue. The SelectSingleNode method is relative to your current scope
(or position in the XmlDocument).

Your XPath expression is saying, get me the first status child element of
the first channel child element from where I am current at.

You are executing it from the objDoc object which does not have any channel
child elements. It has a single child element called channelSnapshot.

You can use this syntax:

Dim Node As XmlNode =
objDoc.DocumentElement.SelectSingleNode("/channel/status")

which uses the same XPath expession but 'moves' the starting point to the
channelSnapshot element, or you can use this syntax:

Dim Node As XmlNode = objDoc.SelectSingleNode("//channel/status")

where the // indicates 'any descendant' element.

To get the value you then need to use:

Dim status As String = Node.InnerText

Like wise the next bit would be:


Node = objDoc.SelectSingleNode("//channel/game")

Dim id As String = Node.Attibbutes("id").Value
 
M

Mark Cooney

Stephany

Thanks for your help, I have made the changes and tried variations but
unfortunately I am still getting same.

This is the code I have now:

Dim response As HttpWebResponse = request.GetResponse()

'Get the response stream

Dim reader As StreamReader = New StreamReader(response.GetResponseStream)

Dim objDoc As New System.Xml.XmlDocument

objDoc.Load(reader)

Dim Node As XmlNode =
objDoc.DocumentElement.SelectSingleNode("//channelSnapshot/channel/status")

MsgBox(Node.InnerText)

Do you have a sample piece of code I could look at?

Regards
 
S

Stephany Young

I gave you the code!!!!

Why did you change:

Dim Node As XmlNode = objDoc.SelectSingleNode("//channel/status")

to

Dim Node As XmlNode =
objDoc.DocumentElement.SelectSingleNode("//channelSnapshot/channel/status")

Notice the difference!!!!!!
 
M

Mark Cooney

While i've tried many variations of what you said but I am still getting the
error.

I am now trying XMLReader.

I have got it reading but going through the XML and looking up "status" and
it is returning the contents of the each of the status elements within the
documents.

Next step, just give it what i need!!
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top