您的位置:首页 > 其它

LINQ TO XML 操作技巧之一

2011-09-12 15:16 429 查看
LINQ TO XML 操作技巧之一



Imports System.Xml
Imports System.Xml.Linq
Imports System.Collections
Imports System.Linq

Public Class XmlRW

    Private XmlFile As String = "info.xml"
    Private Root As XElement

    Public Structure CommData
        Public PortName As String
        Public CommSet As String
        Public Yibao As String
        Public CommMode As String
        Public CommAddr As Integer
        Public Volid As Boolean
    End Structure

    Dim TmpComm() As CommData

    Sub New()                          ‘构造时进行加载
        Root = XElement.Load(XmlFile)
    End Sub
    Sub New(ByVal pFileStr As String)  ‘构造时进行添加路径
        XmlFile = pFileStr
        Root = XElement.Load(XmlFile)
    End Sub

    ''' <summary>
    ''' 返回某一相同节点的所有个数量
    ''' </summary>
    ''' <param name="pNodeStr"></param>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public ReadOnly Property NodeCounts(ByVal pNodeStr As String) As Integer
        Get
            Return Root.Elements(pNodeStr).Count
        End Get
    End Property

    ''' <summary>
    ''' 返回指定节点的所有字节容
    ''' </summary>
    ''' <param name="pNodeStr"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function XmlFinds(ByVal pNodeStr As String) As List(Of CommData)
        '  Dim i As Integer = NodeCounts("Com")                             'root.Elements("Com").Count返回相同名称(节点)的数目
        Dim c As New List(Of CommData)
        Dim mComm As New CommData
        Try

            For Each m As XElement In Root.Elements(pNodeStr)                    '对内部属性进行更细的分析
                mComm = FillCommData(m)
                c.Add(mComm)
            Next

            Return c

        Catch ex As Exception
            Err.Clear()
        End Try
    End Function

    Public Function XmlFind(ByVal pNodeStr As String) As XElement
        Dim pXele As XElement
        pXele = Root.Element(pNodeStr)
        Return pXele

    End Function

    ''' <summary>
    ''' 查找相同节点中某一行的内容
    ''' </summary>
    ''' <param name="pNodeStr"></param>
    ''' <param name="pSort"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function XmlFind(ByVal pNodeStr As String, ByVal pSort As Integer) As CommData
        Dim i As Integer = NodeCounts(pNodeStr) - 1
        If i < pSort Then pSort = i
        Dim mCommData As New CommData
        Dim Xele As XElement = Root.Elements(pNodeStr)(pSort)
        mCommData = FillCommData(Xele)
        Return mCommData
    End Function

    Public Function XmlFind(ByVal pNodeStr As String, ByVal pAttribeName As String, ByVal pAttribeValue As String) As CommData

        Dim Jxle As IEnumerable(Of XElement) = From u In Root.Elements(pNodeStr) Where CType(u.Attribute(pAttribeName) = pAttribeValue, String) Select u
        Dim tmpS As New CommData
        For Each m As XElement In Jxle
            tmpS = FillCommData(m)
        Next

        Return tmpS
    End Function
    ''' <summary>
    ''' 在同一个节点之内最后一个位置
    ''' </summary>
    ''' <param name="pNodeStr"></param>
    ''' <param name="pXele"></param>
    ''' <param name="pNext"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function XmlAddNode(ByVal pNodeStr As String, ByRef pXele As XElement, Optional ByVal pNext As Boolean = True) As Boolean
        Try
            Dim child1 As XElement = Root.Element(pNodeStr).LastNode
            'Dim Nele As XElement = <Com>
            '                           <newValue>ffff</newValue>
            '                       </Com>
            If pNext Then
                child1.AddAfterSelf(pXele)
            Else
                child1.AddAfterSelf(pXele)
            End If
            Root.Save(XmlFile)
            Return True
        Catch ex As Exception
            MsgBox("读取数据失败,失败号106")
            Return Nothing
        End Try
    End Function

    ''' <summary>
    ''' 按指定的相同节点的序列号处前后来加入新的节点
    ''' </summary>
    ''' <param name="pNodeStr"></param>
    ''' <param name="pXele"></param>
    ''' <param name="pBit"></param>
    ''' <param name="pNext"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function XmlAddNode(ByVal pNodeStr As String, ByRef pXele As XElement, ByVal pBit As Integer, Optional ByVal pNext As Boolean = True) As Boolean
        '在同一组节点之内某一位置节点内的最后位置
        Try

            Dim i As Integer = NodeCounts(pNodeStr) - 1
            If pBit > i Then pBit = i
            Dim child1 As XElement = Root.Elements(pNodeStr)(pBit).LastNode
            ' Dim Child2 As XElement = Root.Elements(pNodeStr).Last
            If pNext Then
                child1.AddAfterSelf(pXele)
            Else
                child1.AddAfterSelf(pXele)
            End If
            Root.Save(XmlFile)
            Return True
        Catch ex As Exception
            MsgBox("读取数据失败,失败号105")
            Return Nothing
        End Try
    End Function

    ''' <summary>
    ''' 按指定位置位前后(需要指定父节点,子节点,子节点的值,插入新的节点及位内容;
    ''' </summary>
    ''' <param name="pParentNode"></param>
    ''' <param name="pChildNode"></param>
    ''' <param name="pChildValue"></param>
    ''' <param name="pXele"></param>
    ''' <param name="pNext"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function XmlAddNode(ByVal pParentNode As String, ByVal pChildNode As String, ByVal pChildValue As String, ByRef pXele As XElement, Optional ByVal pNext As Boolean = True) As Boolean
        Try
            Dim MyQuery As IEnumerable(Of XElement) = From myElement In Root.Elements(pParentNode) Where CType(myElement.Element(pChildNode) = pChildValue, String) Select myElement
            Dim xle As XElement = MyQuery.Elements.FirstOrDefault

            If pNext Then
                xle.AddAfterSelf(pXele)
            Else
                xle.AddAfterSelf(pXele)
            End If
            Console.WriteLine(Root)

            Root.Save(XmlFile)
            Return True
        Catch ex As Exception
            MsgBox("读取数据失败,失败号104")
            Return Nothing
        End Try
    End Function

    '单一节点修改
    ''' <summary>
    ''' 按指定的节点,指定的属性和新的值
    ''' </summary>
    ''' <param name="pParentNode"></param>
    ''' <param name="pChildNode"></param>
    ''' <param name="pChildValue"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function XmlUpdate(ByVal pParentNode As String, ByVal pChildNode As String, ByVal pChildValue As String) As Boolean

        Root.Element(pParentNode).SetElementValue(pChildNode, pChildValue)
        Root.Save(XmlFile)

    End Function

    '多个相同节点的位置中某一个位置修改
    ''' <summary>
    '''  按指定的节点,指定的节点和指定的属性和新的值
    ''' </summary>
    ''' <param name="pParentNode"></param>
    ''' <param name="pChildNode"></param>
    ''' <param name="pChildValue"></param>
    ''' <param name="pNewChildValue"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function XmlUpdate(ByVal pParentNode As String, ByVal pChildNode As String, ByVal pChildValue As String, ByVal pNewChildValue As String) As Boolean
        Dim MyQuery As IEnumerable(Of XElement) = From myElement In Root.Elements(pParentNode) Where CType(myElement.Element(pChildNode) = pChildValue, String) Select myElement

        Dim xle As XElement = MyQuery.Elements.FirstOrDefault
        Try
            xle.SetValue(pNewChildValue)
            Console.WriteLine(Root)
            Root.Save(XmlFile)
            Return True
        Catch ex As Exception
            Err.Clear()
            Return False
        End Try

    End Function

    Public Function XmlUpdate(ByVal pParentNode As String, ByVal pXele As XElement) As Boolean
        Root.Element(pParentNode).ReplaceWith(pXele)
        Root.Save(XmlFile)
        Return True
    End Function

    Public Function XmlUpdate(ByVal pParentNode As String, ByVal pAttribeName As String, ByVal pCommData As CommData) As Boolean

        Dim TmpTxt As String = pCommData.Yibao
        Try
            Dim MyQuery = From u In Root.Elements(pParentNode) Where CType(u.Attribute(pAttribeName) = TmpTxt, String) Select u

            For Each m As XElement In MyQuery
                Dim Tmp As XElement = <YiBao Name=<%= pCommData.Yibao %>>
                                          <PortName><%= pCommData.PortName %></PortName>
                                          <CommSet><%= pCommData.CommSet %></CommSet>
                                          <CommMode><%= pCommData.CommMode %></CommMode>
                                          <CommAddr><%= pCommData.CommAddr %></CommAddr>
                                          <Volid><%= pCommData.Volid %></Volid>
                                      </YiBao>
                m.ReplaceWith(Tmp)
            Next
            Root.Save(XmlFile)
        Catch ex As Exception
            MsgBox("读取数据失败,失败号103")
            Return Nothing
        End Try

    End Function

    Public Function XmlNodeChange(ByVal pChildNode As String, ByVal pChildValue As CommData) As Boolean
        Dim pVar As String = pChildNode.ToUpper.Trim
        Try

            Dim Xle As XElement = Root.Element(pVar)
            Dim Tmp As XElement = <<%= pVar %>>
                                      <CommSet><%= pChildValue.CommSet %></CommSet>
                                      <YiBao><%= pChildValue.Yibao %></YiBao>
                                      <CommMode><%= pChildValue.CommMode %></CommMode>
                                      <CommAddr><%= pChildValue.CommAddr %></CommAddr>
                                      <Volid><%= pChildValue.Volid %></Volid>
                                  </>

            Root.Element(pVar).ReplaceWith(Tmp)
            Root.Save(XmlFile)
            Return True
        Catch ex As Exception
            MsgBox("读取数据失败,失败号102")
            Return Nothing
        End Try

    End Function

    ''' <summary>
    ''' 删除节点下的一个字节点
    ''' </summary>
    ''' <param name="pParentNode"></param>
    ''' <param name="pChildNode"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function XmlDelete(ByVal pParentNode As String, ByVal pChildNode As String) As Boolean
        Root.Element(pParentNode).Element(pChildNode).Remove()
        Root.Save(XmlFile)
        Return True
    End Function

    ''' <summary>
    ''' 删除节点所有内容
    ''' </summary>
    ''' <param name="pParentNode"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function XmlDelete(ByVal pParentNode As String) As Boolean
        Root.Element(pParentNode).RemoveAll()
        Root.Save(XmlFile)
        Return True
    End Function

    ''' <summary>
    ''' 删除除属性外的所有节点
    ''' </summary>
    ''' <param name="pParentNode"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function XmlPropDelete(ByVal pParentNode As String) As Boolean

        Try
            Root.Element(pParentNode).RemoveNodes()
            Root.Save(XmlFile)
            Return True
        Catch ex As Exception
            Err.Clear()
            Return False
        End Try

    End Function

    Public Sub XmlToTvw(ByRef pTvw As TreeView)
        pTvw.Nodes.Clear()
        Dim MyQuery As IEnumerable(Of XElement) = From myElement In root.Elements("YiBao") Select myElement
        For Each m As XElement In MyQuery
            Dim nNode As New TreeNode()
            Dim att As XAttribute = m.Attribute("Name")
            nNode.Text = att.Value

            Dim zNode1 As New TreeNode
            Dim zNode2 As New TreeNode
            Dim zNode3 As New TreeNode
            Dim zNode4 As New TreeNode
            Dim zNode5 As New TreeNode

            With m
                zNode1.Text = m.Element("PortName").Value
                zNode2.Text = m.Element("CommSet").Value
                zNode3.Text = m.Element("CommMode").Value
                zNode4.Text = m.Element("CommAddr").Value
                zNode5.Text = m.Element("Volid").Value
            End With
            With nNode.Nodes
                .Add(zNode1)
                .Add(zNode2)
                .Add(zNode3)
                .Add(zNode4)
                .Add(zNode5)
            End With

            pTvw.Nodes.Add(nNode)
        Next
    End Sub

    Private Function FillCommData(ByRef pXele As XElement) As CommData
        Dim TmpS As New CommData

        Try

            With TmpS
                Dim att As XAttribute = pXele.Attribute("Name")
                .Yibao = att.Value
                .PortName = pXele.Element("PortName").Value
                .CommSet = pXele.Element("CommSet").Value
                .CommMode = pXele.Element("CommMode").Value
                .CommAddr = pXele.Element("CommAddr").Value
                .Volid = pXele.Element("Volid").Value
            End With
            Return TmpS
        Catch ex As Exception
            MsgBox("读取数据失败,失败号101")
            Return Nothing
        End Try

    End Function

End Class

Public Class XmlLog

    Private XmlFile As String = ClsDBOperation.GFilePath & "LogFile.xml"
    Private Root As XElement

    Sub New()
        Console.WriteLine(XmlFile)
        Root = XElement.Load(XmlFile)
    End Sub

    Sub New(ByVal pFileStr As String)
        XmlFile = pFileStr
        Root = XElement.Load(XmlFile)
    End Sub

    Public Function XmlAddNode(ByVal pNodeStr As String, ByRef pXele As XElement, Optional ByVal pNext As Boolean = True) As Boolean
        'Dim child1 As XElement = Root.Element(pNodeStr)
        'If pNext Then
        '    child1.AddAfterSelf(pXele)
        'Else
        '    child1.AddBeforeSelf(pXele)
        'End If
        ' Root.LastNode.AddAfterSelf(pXele)
        Root.Add(pXele)
        Root.Save(XmlFile)
        Return True
    End Function
End Class
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: