首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VB Dotnet >

做了一个批改节点的例子,还需要改进,有没大侠有兴趣瞧一瞧

2012-12-16 
做了一个修改节点的例子,还需要改进,有没大侠有兴趣瞧一瞧本帖最后由 wuyazhe 于 2012-09-11 22:06:32 编

做了一个修改节点的例子,还需要改进,有没大侠有兴趣瞧一瞧
本帖最后由 wuyazhe 于 2012-09-11 22:06:32 编辑 第一个贴子地址

        ''' <summary>
        ''' 在xml文档指定节点下修改子节点,只修改最先找到的那个节点
        ''' </summary>
        ''' <param name="XmlPath">xml路径</param>
        ''' <param name="Node" >节点</param>
        '''<param name="ChildNode" >子节点</param>
        ''' <param name="ChildsNode" >子节点的节点</param>
        ''' <param name="ChildesNode" >下一子节点</param>
        ''' <param name="Value" >新添节点的值</param>
        Public Shared Function ReadXmlReplaceNode(ByVal Node As String, Optional ByVal Value As String = "", Optional ByVal ChildNode As String = "", Optional ByVal ChildsNode As String = "", Optional ByVal ChildesNode As String = "", Optional ByVal XmlPath As String = "CKs.xml") As Integer
            If Trim(Node) = "" Then
                Return 0
            Else
                Node = Node.ToUpper.Trim
            End If
            Dim docXml As New XmlDocument()
            docXml.Load(XmlPath)
            Value = Value.Trim
            If docXml.DocumentElement.Name = OneNode Then        '查看文件是否正确
                Dim v1, v2, v3 As Boolean
                If Not Trim(ChildNode) = "" Then
                    v1 = True
                    ChildNode = ChildNode.ToUpper.Trim
                    If Not Trim(ChildsNode) = "" Then
                        v2 = True
                        ChildsNode = ChildsNode.ToUpper.Trim
                        If Not Trim(ChildesNode) = "" Then


                            v3 = True
                            ChildesNode = ChildesNode.ToUpper.Trim
                        End If
                    End If
                End If
                If v1 = False Then
                    For Each ThisRec As XmlNode In docXml.DocumentElement
                        If ThisRec.Name = Node Then
                            ThisRec.InnerText = Value
                            docXml.Save(XmlPath)
                            Return 1
                        End If
                    Next
                ElseIf v2 = False Then
                    For Each ThisRec As XmlNode In docXml.DocumentElement
                        If ThisRec.Name = Node Then
                            For Each Child As XmlNode In ThisRec
                                If Child.Name = ChildNode Then
                                    Child.InnerText = Value
                                    docXml.Save(XmlPath)
                                    Return 2
                                End If


                            Next
                        End If
                    Next
                ElseIf v3 = False Then
                    For Each ThisRec As XmlNode In docXml.DocumentElement
                        If ThisRec.Name = Node Then
                            For Each Child As XmlNode In ThisRec
                                If Child.Name = ChildNode Then
                                    For Each Childs As XmlNode In Child
                                        If Childs.Name = ChildsNode Then
                                            Childs.InnerText = Value
                                            docXml.Save(XmlPath)
                                            Return 3
                                        End If
                                    Next
                                End If
                            Next
                        End If
                    Next


                Else
                    For Each ThisRec As XmlNode In docXml.DocumentElement
                        If ThisRec.Name = Node Then
                            For Each Child As XmlNode In ThisRec
                                If Child.Name = ChildNode Then
                                    For Each Childs As XmlNode In Child
                                        If Childs.Name = ChildsNode Then
                                            For Each Childes As XmlNode In Childs
                                                If Childes.Name = ChildesNode Then
                                                    Childes.InnerText = Value
                                                    docXml.Save(XmlPath)
                                                    Return 4
                                                End If
                                            Next
                                        End If


                                    Next
                                End If
                            Next
                        End If
                    Next
                End If
            End If
            Return 0
        End Function


[解决办法]
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<CK CreateDate="2012-09-10">
  <!--非必须勿动此文件!!!-->
  <LOGIN>
    <URL>cc</URL>
    <USER>123</USER>
    <USER>123</USER>
    <USER>123</USER>
    <USER>123</USER>
    <OR>11<x2>11</x2></OR>
  </LOGIN>
  <COR>
    <USER>123</USER>
  </COR>
  <X2 />
</CK>

以这 XML 为例,我修改 <COR>  值为空时,结果 <USER> 一行被删掉了
[解决办法]
XmlDocument 节点其中有三个属性,InnerText、InnerXml、FirstChild.Value。

XmlDocument doc = new XmlDocument();
doc.LoadXml("<n1><n1.1>content1</n1.1><n1.2>content2</n1.2></n1>");
string str = "InnerText:" + doc.ChildNodes[0].InnerText + "\r\n" +
             "InnerXml:" + doc.ChildNodes[0].InnerXml + "\r\n" +
             "Value:" + doc.ChildNodes[0].FirstChild.Value;
InnerText 的值为 content1content2。
InnerXml 的值为 <n1.1>content1</n1.1><n1.2>content2</n1.2>。
FirstChild.Value 的值为零长度字符串。
区别

InnerText 只是取 #Text 节点内容,而 InnerXml 则具有子节点名称、<![CDATA[]]> 等。
InnerText 和 InnerXml 的共同点是都具有“穿透性”,而 FirstChild.Value 则不具有穿透性,所以这里取不到值。也正因为 InnerText 和 InnerXml 具有“穿透性”,所以我们可以不必像 Value 一样多一层 FirstChild(或 ChileNodes[0])用来表示文本节点,当然多一层也是正确的。
因为 InnerText 与 InnerXml 具有“穿透性”,实际应用中,我们可以省略文本节点这一层,这样节点内容为空(<![CDATA[]]> 不算为空)的时候,不会报错。而 FirstChild.Value 则做不到。

热点排行