读取xml流

时间:2009-07-09 17:35:22

标签: xml vb.net streamreader

我正在尝试阅读以下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"/>

我无法超越财产这个词。

显而易见,这对我来说都是新手,所以我欢迎所有人和任何帮助。

4 个答案:

答案 0 :(得分:1)

不同的方法怎么样?正如您目前所做的那样处理流似乎非常困难。

如果您将整个流读入字符串然后将该字符串加载到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会告诉你这个,所以你将能够修复它。

答案 1 :(得分:0)

您需要将它们作为属性读取。请参阅GetAttribute()方法。

例如:

Dim cardName as String = reader.GetAttribute("name")

答案 2 :(得分:0)

在创建XmlReader时,应考虑使用XmlReaderSettings来简化对基础流的解析(即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...
        }
    }
}

另外,检查properties基类的methodsXmlReader以确定如何获取元素,属性和其他XML实体。

答案 3 :(得分:0)

您的XML格式不正确。你有没有关闭标签的开放标签。如果你缩进了XML,你会看到它。

此外,除非您使用.NET 1.1,否则不应使用XmlTextReader。使用XmlReader.Create。

除了直接使用XmlReader之外,您可能还需要查看LINQ to XML,它提供了一种更简单的搜索XML模型,或旧的XmlDocument,您可以从XmlReader加载。