читать поток XML - PullRequest
1 голос
/ 09 июля 2009

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

Тогда я могу получить доступ к значению в порядке. Я использую Select Case xmlnodetype, но использую его, когда тип узла является пробелом Я не могу добраться до элемента за пределами пробела. Так что в следующей строке

 <property name="Card 1" value="NOT AVAILABLE"/>

Я не могу найти ничего, кроме слова «свойство».

Как должно быть очевидно, это все ново для меня, поэтому я бы приветствовал всех и любую помощь.

Ответы [ 4 ]

1 голос
/ 09 июля 2009

Как насчет другого подхода? Обработка потока, как вы сейчас делаете, кажется довольно сложной работой.

Если вместо этого вы прочитаете весь поток в строку, а затем загрузите эту строку в 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 сообщит вам об этом, чтобы вы могли это исправить.

0 голосов
/ 09 июля 2009

Вам следует рассмотреть возможность использования XmlReaderSettings при создании XmlReader для упрощения анализа базового потока (т. Е. XmlReaderSettings.IgnoreWhitespace ).

Тогда вы сможете анализировать поток следующим образом.

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.

0 голосов
/ 09 июля 2009

Ваш XML не правильно сформирован. У вас есть открытые теги без закрытых тегов. Если бы вы сделали отступ в XML, вы бы это увидели.

Кроме того, если вы не застряли в .NET 1.1, вы не должны использовать XmlTextReader. Используйте XmlReader.Create.

Помимо непосредственного использования XmlReader, вам может потребоваться взглянуть на LINQ to XML, который предоставляет несколько более простую модель для поиска в XML, или на более старый XmlDocument, который можно загрузить из XmlReader.

0 голосов
/ 09 июля 2009

Вам нужно будет прочитать их как атрибуты. См. Метод GetAttribute ().

Например:

Dim cardName as String = reader.GetAttribute("name")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...