Вопрос

Я пытаюсь прочитать следующий 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top