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
相关文章推荐
- 在metro应用中用linq to xml+文件操作生成XML
- Linq操作数据库、Linq To XML
- LINQ to XML 操作XML文档
- linq to xml操作XML
- linq to xml 简单的增、删、改、查、保存xml文件操作
- LINQtosqllinqtoxml\JS操作JSON
- [C#]Linq To Xml 实例操作- 转
- 使用Linq to XML操作XML的元素
- LINQ to XML操作Xml文档
- Linq To Xml操作XML增删改查
- linq to xml操作XML
- C#使用LINQ to XML操作XML实例
- 使用Linq to XML操作XML的属性
- LINQ to XSD - 操作强类型xml
- asp.net MVC中linq to xml的简单操作
- linq to xml操作XML,这是转的大神的,自己学习了,也希望你们也能学习一下
- linq to xml操作XML
- linq to xml 基本操作
- linq to xml操作XML
- Linq to xml 操作带命名空间的xml