读书人

做了一个批改节点的例子,还需要改进,有

发布时间: 2012-12-16 12:02:32 作者: rapoo

做了一个修改节点的例子,还需要改进,有没大侠有兴趣瞧一瞧
本帖最后由 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 则做不到。

读书人网 >VB Dotnet

热点推荐