【问题标题】:parsing xml file with nested nodes using xmlreader and vb.net使用 xmlreader 和 vb.net 解析带有嵌套节点的 xml 文件
【发布时间】:2011-12-29 18:39:33
【问题描述】:

我正在尝试解析这个包含一些嵌套节点的 xml 文件。不知道怎么把看起来整齐的xml文件内容放在这里。如果你能告诉我怎么做,那就太好了。

这是我的代码。我能够检索一些信息,但其中一些信息不正确(strGrant 的值应该用于 strSupport)。 有人能告诉我我的代码有什么问题吗?我是这里的新手。任何帮助表示赞赏!

    Dim strGrant, strSupport, strDatabank, strWeight, strNumOfGrants, strNumOfSupports, strNumOfDatabanks As String

    While XmlReader.Read()
        Console.WriteLine("{0}: {1}", XmlReader.NodeType.ToString(), XmlReader.Name)

        If XmlReader.Name.ToString() = "GrantInfo/NumberOfGrants" Then strNumOfGrants = Trim(XmlReader.ReadString())

        If XmlReader.Name.ToString() = "NumberOfGrants" Then strNumOfGrants = Trim(XmlReader.ReadString())

        If (XmlReader.Name.ToString() = "Grant/CLabelInfo") Then strGrant = XmlReader.ReadString()

        If XmlReader.Name.ToString() = "Name" Then strGrant = XmlReader.ReadString()
        '    ''End If

        If XmlReader.Name.ToString() = "CleanUpData/DatabankInfo/NumberOfDatabanks" Then strNumOfDatabanks = Trim(XmlReader.ReadString())

        If XmlReader.Name.ToString() = "NumberOfDatabanks" Then strNumOfDatabanks = Trim(XmlReader.ReadString())

        If XmlReader.Name.ToString() = "Databank/CLabelInfo" Then strDatabank = Trim(XmlReader.ReadString())

        If XmlReader.Name.ToString() = "Name" Then strDatabank = XmlReader.ReadString()

        If XmlReader.Name.ToString() = "Confidence" Then strWeight = XmlReader.ReadString()


        If XmlReader.Name.ToString() = "Name" And XmlReader.NodeType.ToString() = "EndElement" Then

            Response.Write("- Number of Grants: " & strNumOfGrants & "<br>")
            Response.Write("- Grant Numbers: " & strGrant & "<br>")         

        End If
        If XmlReader.Name.ToString() = "CleanUpData/SupportInfo/NumberOfSupports" Then strNumOfSupports = Trim(XmlReader.ReadString())
        If XmlReader.Name.ToString() = "NumberOfSupports" Then strNumOfSupports = Trim(XmlReader.ReadString())
        If XmlReader.Name.ToString() = "Support/CLabelInfo" Then strSupport = Trim(XmlReader.ReadString())
        If XmlReader.Name.ToString() = "Name" Then strSupport = Trim(XmlReader.ReadString())
        If XmlReader.Name.ToString() = "CLabelInfo" And XmlReader.NodeType.ToString() = "EndElement" Then
            Response.Write("- Number of Supports: " & strNumOfSupports & "<br>")
            Response.Write("- Support Number: " & strSupport & "<br>")

        End If
        If XmlReader.Name.ToString() = "CleanUpData/DatabankInfo/NumberOfDatabanks" Then strNumOfSupports = Trim(XmlReader.ReadString())
        If XmlReader.Name.ToString() = "NumberOfDatabanks" Then strNumOfDatabanks = Trim(XmlReader.ReadString())
        If XmlReader.Name.ToString() = "Databank/CLabelInfo" Then strDatabank = Trim(XmlReader.ReadString())
        If XmlReader.Name.ToString() = "Name" Then strDatabank = Trim(XmlReader.ReadString())
        If XmlReader.Name.ToString() = "CLabelInfo" And XmlReader.NodeType.ToString() = "EndElement" Then
            Response.Write("- Number of Databanks: " & strNumOfDatabanks & "<br>")
            Response.Write("- Databank Number: " & strDatabank & "<br>")

        End If
    End While
    XmlReader.Close()

这是我的结果:

授权数量:1
- 授权号:DK30111
- 支持数量:
- 支持号码:
- 数据库数量:
- 数据库编号:
- 资助数量:1
- 拨款编号:NIHExtra
- 支持数量:1
- 支持号码:
- 数据库数量:
- 数据库编号:
- 资助数量:1
- 授权号:RefSeq/NM_007614
- 支持数量:1
- 支持号码:
- 数据库数量:
- 数据库编号:
- 资助数量:1
- 授权号:RefSeq/NM_008084
- 支持数量:1
- 支持号码:
- 数据库数量:
- 数据库编号:
- 资助数量:1
- 授权号:[未找到]
- 支持数量:1
- 支持号码:
- 数据库数量:
- 数据库编号:

【问题讨论】:

  • 您是否仅限于使用XmlReader? LINQ to XML 会更容易使用。

标签: xml vb.net


【解决方案1】:

这是因为您错误地使用了节点名称。节点名称将仅包含当前节点的名称,而不包含名称层次结构。

因此,您需要更改您的姓名声明以反映这一点。如果比较是在 case 语句中,它也会更有效。最后,要考虑文件大小写的波动,您应该比较大写或小写。

这是一个例子:

Select Case XmlReader.Name.ToString().ToLower
    Case "numberofgrants" 
        strNumOfGrants = Trim(XmlReader.ReadString())

End Select

您应该能够将其余部分转换为这种格式。

【讨论】:

  • 感谢您的快速回答。它确实有帮助。我有另一个问题。如何搜索节点名相同但父节点名不同的嵌套节点?
  • @dylanm:最好将其作为一个新问题提出,以便其他人可以从答案中受益(即它不会被埋没在 cmets 中)。另外,请记住,如果答案解决或帮助您解决问题,您应该单击复选标记和(当您有足够的声誉时)答案旁边的向上箭头。这样,这个问题的未来访问者就会知道这就是解决您问题的原因。
猜你喜欢
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多