简体   繁体   中英

parsing xml file with nested nodes using xmlreader and vb.net

I am trying to parse this xml file, which has some nested nodes. I don't know how to put the xml file content that looks neat here. if you can tell me how, that would be great too.

And this is my code. I am able to retrieve some info, but some of them is not correct (strGrant has values that is supposed to be for strSupport). Can someone tell me what is wrong with my code. I am a newbie here. any help is appreciated!

    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()

This is my result:

Number of Grants: 1
- Grant Numbers: DK30111
- Number of Supports:
- Support Number:
- Number of Databanks:
- Databank Number:
- Number of Grants: 1
- Grant Numbers: NIHExtra
- Number of Supports: 1
- Support Number:
- Number of Databanks:
- Databank Number:
- Number of Grants: 1
- Grant Numbers: RefSeq/NM_007614
- Number of Supports: 1
- Support Number:
- Number of Databanks:
- Databank Number:
- Number of Grants: 1
- Grant Numbers: RefSeq/NM_008084
- Number of Supports: 1
- Support Number:
- Number of Databanks:
- Databank Number:
- Number of Grants: 1
- Grant Numbers: [NOT FOUND]
- Number of Supports: 1
- Support Number:
- Number of Databanks:
- Databank Number:

This is because you are using the node Name incorrectly. The node name will only contain the current node's name, not the name hierarchy.

So you will need to change your name statements to reflect this. It will also be more efficient if the comparison was in a case statement. Finally, to account for fluctuations in the casing of the file, you should compare either upper or lowercase.

Here is an example:

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

End Select

You should be able to convert the rest to this format.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM