1

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

4 回答 4

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 会告诉您这一点,以便您能够修复它。

于 2009-07-09T18:07:25.253 回答
0

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

例如:

Dim cardName as String = reader.GetAttribute("name")
于 2009-07-09T17:51:12.230 回答
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...
        }
    }
}

此外,检查XmlReader基类的属性方法以确定如何获取元素、属性和其他 XML 实体。

于 2009-07-09T17:54:10.790 回答
0

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

此外,除非您在使用 .NET 1.1 时遇到困难,否则不应使用 XmlTextReader。使用 XmlReader.Create。

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

于 2009-07-09T17:57:23.963 回答