Вопрос
Я пытаюсь прочитать следующий xml-поток, но мне действительно трудно.
<channelSnapshot xmlns="urn:betfair:games:api:v1">
<channel gameType="BLACKJACK" id="1444077" name="Exchange BlackJack">
<status>RUNNING</status>
<game id="190675">
<round>1</round>
<bettingWindowTime>30</bettingWindowTime>
<bettingWindowPercentageComplete>100</bettingWindowPercentageComplete>
<gameData>
<object name="Player 1">
<description/>
<status>IN_PLAY</status>
<property name="Card 1" value="NOT AVAILABLE"/>
<property name="Card 2" value="NOT AVAILABLE"/>
</object>
Поток получается следующим образом
Dim dataStream As Stream = response.GetResponseStream()
Dim reader As New XmlTextReader(dataStream)
Если элемент находится между начальным тегом и конечным тегом, например
<status>RUNNING</status>
Тогда я смогу получить доступ к значению ok.Я использовал Select Case xmlnodetype, но использую это, когда nodetype является пробелом Я не могу добраться до элемента за пробелом.Так что в следующей строке
<property name="Card 1" value="NOT AVAILABLE"/>
Я не могу перейти ни к чему, кроме слова "собственность".
Как должно быть очевидно, все это для меня в новинку, поэтому я был бы рад любой помощи.
Решение
Как насчет другого подхода?Обработка потока, как вы делаете в данный момент, кажется довольно тяжелой работой.
Если вы вместо этого прочитаете весь поток в строку, а затем загрузите эту строку в XDocument - документ вы сможете обрабатывать файл намного проще.
VB позволяет вам получать доступ к данным из Xml-файлов очень простым способом, взгляните на следующий код, чтобы понять, что я имею в виду:
' get the response stream so we can read it
Dim responseStream = response.GetResponseStream()
' create a stream reader to read the response
Dim responseReader = New IO.StreamReader(responseStream)
' read the response text (this should be javascript)
Dim responseText = responseReader.ReadToEnd()
' load the response into an XDocument
Dim xmlDocument = XDocument.Parse(responseText)
' find all the player objects from the document
For Each playerObject In xmlDocument...<object>
' display the player's name (this is how you access an attribute)
Console.WriteLine("Player name: {0}", playerObject.@name)
' display the player's status (this is how you access an element)
Console.WriteLine("Player status: {0}", playerObject.<status>.Value)
Next
Чтобы получить свойства вашего плеера, вы можете сделать следующее:
' go through the player's properties
For Each playerProperty In playerObject...<property>
' output the values
Console.WriteLine("Player property name: {0}", playerProperty.@name)
Console.WriteLine("Player property value: {0}", playerProperty.@value)
Next
Как уже упоминал кто-то другой, ваш Xml неверно сформирован, но XDocument расскажет вам об этом, чтобы вы могли это исправить.
Другие советы
Вам нужно будет прочитать их как атрибуты.Смотрите на Получить атрибут() метод.
Например:
Dim cardName as String = reader.GetAttribute("name")
Вам следует рассмотреть возможность использования Настройки XmlReaderSettings при создании вашего XmlReader для упрощения синтаксического анализа базового потока (т. е. Настройки XmlReaderSettings.Игнорируйте пустое пространство).
Затем вы должны быть в состоянии проанализировать поток способом, аналогичным следующему.
using (XmlReader reader = XmlReader.Create(dataStream))
{
while(reader.Read())
{
switch(reader.NodeType)
{
case XmlNodeType.Element:
// do something
case XmlNodeType.Attribute:
// do something
// etc...
}
}
}
Кроме того, проверьте свойства и методы из числа XmlReader - программа для чтения базовый класс для определения того, как получить доступ к элементам, атрибутам и другим XML-объектам.
Ваш XML-файл неправильно сформирован.У вас есть открытые теги без каких-либо закрытых тегов.Если бы вы сделали отступ в своем XML-файле, вы бы это увидели.
Кроме того, если вы не застряли на использовании .NET 1.1, вам не следует использовать XmlTextReader.Используйте XmlReader.Создать.
В дополнение к непосредственному использованию XmlReader, вы можете захотеть взглянуть на LINQ to XML, который предоставляет несколько более простую модель поиска в XML, или на более старый XmlDocument, который вы можете загрузить из XmlReader.