VB.NET:从XML文件中读取多个属性和表

时间:2016-03-21 18:19:42

标签: xml vb.net xmlreader xmlwriter readxml

我决定使用XML文件保存一些应用程序数据。我是XML文件的新手,所以请耐心等待。

我有一个这样的课程):

Public Class config
    Public Property name As String
    Public Property type As String

    Public Property inputsTable As DataTable
    Public Property outputsTable As DataTable

    Public Sub WriteXML(filePath As String)
        Using writer As XmlWriter = XmlWriter.Create(filePath)
            writer.WriteStartDocument()
            writer.WriteStartElement("config")

            writer.WriteElementString("name", Me.name)
            writer.WriteElementString("type", Me.type)

            Me.inputsTable.WriteXml(writer)
            Me.outputstable.WriteXml(writer)

            writer.WriteEndElement()
            writer.WriteEndDocument()
        End Using
    End Sub
End Class

WriteXML子结果产生如下文件:

<?xml version="1.0" encoding="utf-8"?>
<config>
    <name>testConfigName</name>
    <type>testConfigType</type>
    <DocumentElement>
        <inputs>
            <inputName>testInputName1</inputName>
            <inputValue>testInputValue1</inputValue>
        </inputs>
        <inputs>
            <inputName>testInputName2</inputName>
            <inputValue>testInputValue2</inputValue>
        </inputs>
    </DocumentElement>
    <DocumentElement>
        <outputs>
            <outputName>testOutputName1</outputName>
            <outputValue>testOutputValue1</outputValue>
        </outputs>
    </DocumentElement>
</config>

我有几个问题:

  1. &#34;根节点&#34;的目的是什么?在XML文件中?我在这 创建了一个节点&#34; config&#34;为了让我的代码正常工作,但我不知道 真的明白为什么有必要。

  2. 是否需要WriteStartDocument / WriteEndDocument?

  3. 如何编写一个sub来将此文件读回我的应用程序?我特别难以把桌子拿出来。我可以使用以下方法获取单个元素:

    Using reader As XmlReader = XmlReader.Create(filePath)
        While reader.Read()
            Select Case reader.NodeType
                Case XmlNodeType.Element
                    Select Case reader.Name
                        Case "name"
                            name = reader.ReadElementContentAsString()
                        Case "type"
                            type = reader.ReadElementContentAsString()
                    End Select    
            End Select
        End While
    End Using
    

    但我不知道如何(或者是否可能)将其与:

    结合起来
    inputsTable.ReadXml(reader)
    outputsTable.ReadXml(reader)
    

    似乎ReadXml实际上可能不适用于我尝试做的事情(阅读特定的表格),并且意味着更简单的单表XML结构,但我无法确定这一点。

  4. 任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:3)

试试这段代码,.Net序列化器为你做了很多工作。

Public Class config
    Public Property name As String
    Public Property type As String

    Public Property inputsTable As DataTable
    Public Property outputsTable As DataTable

    Public Sub WriteXML(filePath As String)

        Dim writer As New XmlSerializer(GetType(config))
        Dim file As New StreamWriter(filePath)
        writer.Serialize(file, Me)
        file.Close()
    End Sub

    Public Shared Function ReadXML(filePath As String) As config

        Dim reader = New XmlSerializer(GetType(config))
        Dim file = New StreamReader(filePath)
        Dim fileData = CType(reader.Deserialize(file), config)

        Return fileData

    End Function

End Class

BTW这些代码模式是您可以通过右键单击轻松访问的片段: 单击“插入片段” - >数据 - LINQ -XML等... - &gt; XML - &gt; XML读/ XML写 - &gt;从/到上课。

如何忽略属性

<XmlIgnore>
Public Property inputsTable As DataTable