【问题标题】:XML Reading using VB.Net使用 VB.Net 读取 XML
【发布时间】:2020-01-31 17:13:25
【问题描述】:
This is the sample XML code. 

<Schedule-Tables>
  <LN-Schedule-Table>
    <Short-Name>world</Short-Name>
    <Position>Start</Position>
    <Table-entrys>
      <Application-Entry>
        <Delay>0.01</Delay>
        <Frame>gh/ho/frTrig_o</Frame>
      </Application-Entry>
      <Application-Entry>
        <Delay>0.02</Delay>
        <Frame>gh/ho/frTrig_O</Frame>
      </Application-Entry>
    </Table-entrys>
  </LN-Schedule-Table>
  <LN-Schedule-Table>
    <Short-Name>worldA</Short-Name>
    <Position>Start</Position>
    <Table-entrys>
      <Application-Entry>
        <Delay>0.03</Delay>
        <Frame>gh/ho/frTrig_oZ</Frame>
      </Application-Entry>
      <Application-Entry>
        <Delay>0.04</Delay>
        <Frame>gh/ho/frTrig_oX</Frame>
      </Application-Entry>
    </Table-entrys>
  </LN-Schedule-Table>
</Schedule-Tables>

我需要阅读在每个“LN-Schedule-Table”下需要“Short-Name”的“Schedule-Table”,在“Table-Entry”下需要“Delay”和“Frame”详细信息。

我是 xml 新手,请帮助我阅读节点的内部详细信息。谢谢。

【问题讨论】:

    标签: xml vb.net


    【解决方案1】:

    由于存在许多方法,这就是其中之一。但是,在您开始查看代码之前,您需要非常注意您的 xml 字符串。 你在标签形成、闭包、名称等方面是错误的。 Xml 需要使用相同的标签名称孔径和闭包进行良好格式化。标签名称中没有空格。使用区分大小写的方法。 (您可以从下面的代码和 xml 字符串中看到区别) 此代码将被视为帮助您理解机制的基础。显然需要根据您的需要完成。

    Private Sub ReadXML()
    
        Dim mxmlString As String = "<Schedule-Tables>
                                   <LN-Schedule-Table>
                                      <Short-Name>world</Short-Name> 
    
                                     <Position>Start</Position>
                                     <Table-Entrys>
                                      <Application-Entry>
                                       <Delay>0.01</Delay>  
                                       <Frame>gh/ho/frTrig_o
                                                     </Frame>
                                      </Application-Entry>  
    
                                      <Application-Entry>
                                       <Delay>0.01</Delay>
                                       <Frame>gh/ho/frTrig_o
                                                     </Frame>
                                      </Application-Entry>
    
                                     </Table-Entrys>
                                    </LN-Schedule-Table>
    
                                    <LN-Schedule-Table>
                                      <Short-Name>world</Short-Name>                           
                                     <Position>Start</Position>
                                     <Table-Entrys>
                                       <Application-Entry>
                                         <Delay>0.01</Delay>  
                                         <Frame>gh/ho/frTrig_o
                                                     </Frame>
                                       </Application-Entry>  
    
                                       <Application-Entry>
                                         <Delay>0.01</Delay>
                                         <Frame>gh/ho/frTrig_o
                                                     </Frame>
                                       </Application-Entry>
    
                                     </Table-Entrys>
                                   </LN-Schedule-Table>
                                  </Schedule-Tables>"
    
    
        Try
    
            Dim mXdoc As Xml.XmlDocument = New Xml.XmlDocument
    
            mXdoc.LoadXml(mxmlString)
    
            Dim mdocElement As Xml.XmlElement = mXdoc.DocumentElement
    
            If mdocElement IsNot Nothing AndAlso mdocElement.HasChildNodes Then
    
                Dim LN_Schedule_Table As Xml.XmlNodeList = mdocElement.GetElementsByTagName("LN-Schedule-Table")
                Dim Table_Entrys As Xml.XmlNodeList = mdocElement.GetElementsByTagName("Table-Entrys")
    
                For Each mLN_Schedule_Table As Xml.XmlElement In LN_Schedule_Table
                    Dim Short_Names As Xml.XmlNodeList = mLN_Schedule_Table.GetElementsByTagName("Short-Name")
    
                    For Each mShort_Name As Xml.XmlNode In Short_Names
    
                        Console.WriteLine("mShort_Name.InnerText = " & mShort_Name.InnerText)
    
                    Next
    
                Next
    
                For Each mTable_Entry As Xml.XmlElement In Table_Entrys
                    Dim Delays As Xml.XmlNodeList = mTable_Entry.GetElementsByTagName("Delay")
                    Dim Frames As Xml.XmlNodeList = mTable_Entry.GetElementsByTagName("Frame")
    
    
                    For Each mDelay As Xml.XmlNode In Delays
    
                        Console.WriteLine("mDelay.InnerText = " & mDelay.InnerText)
    
                    Next
    
    
                    For Each mFrame As Xml.XmlNode In Frames
    
                        Console.WriteLine("mFrame.InnerText = " & mFrame.InnerText)
    
                    Next
    
                Next
    
            End If
    
    
        Catch ex As Exception
            Console.WriteLine(ex.ToString)
        End Try
    
    End Sub
    

    或者

    您可以使用 LINQ。 使用这个例子来了解机制。 请注意层次结构的后代和 XML 格式,正如我在上面的上一个示例中所写的那样。

      Private Sub ReadXML()
    
    
            Try
    
                Dim mxmlString As String = "<Schedule-Tables>
                                   <LN-Schedule-Table>
    
                                      <Short-Name>World</Short-Name> 
                                      <Position>Start</Position>
    
                                     <Table-Entrys>
    
                                      <Application-Entry>
                                       <Delay>0.01</Delay>  
                                       <Frame>gh/ho/frTrig_o</Frame>                                                 
                                      </Application-Entry>  
    
                                      <Application-Entry>
                                       <Delay>0.01</Delay>
                                       <Frame>gh/ho/frTrig_o</Frame>
                                      </Application-Entry>
    
                                     </Table-Entrys>
                                    </LN-Schedule-Table>
    
                                    <LN-Schedule-Table>
    
                                     <Short-Name>Mars</Short-Name>                           
                                     <Position>End</Position>
    
                                     <Table-Entrys>
                                       <Application-Entry>
                                         <Delay>0.01</Delay>  
                                         <Frame>gh/ho/frTrig_o</Frame>
                                       </Application-Entry>  
    
                                       <Application-Entry>
                                         <Delay>0.01</Delay>
                                         <Frame>gh/ho/frTrig_o</Frame>
                                      </Application-Entry>
                                     </Table-Entrys>
    
                                   </LN-Schedule-Table>
                                  </Schedule-Tables>"
    
    
                Dim mXEL As XElement = XElement.Parse(mxmlString)
                Dim dataInAShot = From ScheduleTable In mXEL.Elements("LN-Schedule-Table").AsEnumerable
                                  Select ShortName = ScheduleTable.Descendants("Short-Name").Value,
                                     Position = ScheduleTable.Descendants("Position").Value,
                                     Delay = (ScheduleTable.Descendants("Table-Entrys")).Descendants("Application-Entry").Descendants("Delay").Value,
                                     Frame = (ScheduleTable.Descendants("Table-Entrys")).Descendants("Application-Entry").Descendants("Frame").Value
    
    
    
                For Each mData In dataInAShot
    
                    Console.WriteLine("ShortName = " & mData.ShortName)
                    Console.WriteLine("Position = " & mData.Position)
                    Console.WriteLine("Delay = " & mData.Delay)
                    Console.WriteLine("Frame = " & mData.Frame)
                    Console.WriteLine("============================== ")
    
                Next
    
    
    
            Catch ex As Exception
                Console.WriteLine(ex.ToString)
            End Try
    
        End Sub
    

    【讨论】:

    • 我需要循环对应的调度表的延迟和帧名称。上面的脚本给了我所有的调度表名称,以及所有延迟和帧名称。请告诉我如何整理。调度表|延迟 |框架|。
    • 如何在每个循环中获取与调度表名称相对应的值,在下一个循环中获取下一个调度表及其各自的值。请帮助我如何获得这个
    • 我又添加了一段代码。要想一举两得,请使用第二个。希望对你有帮助
    • 我使用 Dim mXEL 作为 Element = XElement.Load("BoardNet.xml")。对我来说,它不会进入循环。你能帮忙吗?
    • 在脚本“Dim dataInAShot = From ScheduleTable in mXEL”中。在这个 Scheduletable 中它指的是哪一个?。
    【解决方案2】:

    我使用了 XElement。让我建议你把它放在一个 Button Click 中并逐步完成它。我必须修复 XML 才能运行它。

        Dim xe As XElement
        ' to load from a URI
        '   xe = XElement.Load("path here")
        ' for testing use a literal
        xe = <Schedule-Tables>
                 <LN-Schedule-Table>
                     <Short-Name>world</Short-Name>
                     <Position>Start</Position>
                     <Table-entrys>
                         <Application-Entry>
                             <Delay>0.01</Delay>
                             <Frame>gh/ho/frTrig_o</Frame>
                         </Application-Entry>
                         <Application-Entry>
                             <Delay>0.02</Delay>
                             <Frame>gh/ho/frTrig_O</Frame>
                         </Application-Entry>
                     </Table-entrys>
                 </LN-Schedule-Table>
                 <LN-Schedule-Table>
                     <Short-Name>worldA</Short-Name>
                     <Position>Start</Position>
                     <Table-entrys>
                         <Application-Entry>
                             <Delay>0.03</Delay>
                             <Frame>gh/ho/frTrig_oZ</Frame>
                         </Application-Entry>
                         <Application-Entry>
                             <Delay>0.04</Delay>
                             <Frame>gh/ho/frTrig_oX</Frame>
                         </Application-Entry>
                     </Table-entrys>
                 </LN-Schedule-Table>
             </Schedule-Tables>
    
        For Each el As XElement In xe.<LN-Schedule-Table>
            Debug.WriteLine(el.<Short-Name>.Value)
            For Each sel As XElement In el...<Application-Entry>
                Debug.WriteLine(sel.<Delay>.Value)
                Debug.WriteLine(sel.<Frame>.Value)
            Next
        Next
    

    【讨论】:

    • 它没有进入第一个 for 循环结束。
    • @RakeshRadhakrishnan - 我不明白你的评论。我发布的代码有效。
    • 如果我使用 XElement,它不会进入 for 循环本身。如果我使用 XmlNode 它正在显示值,但是如何根据 标记名称 在每个循环中获取相应的值
    猜你喜欢
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 2014-12-21
    • 1970-01-01
    相关资源
    最近更新 更多