以下是由根元素,父节点和子节点组成的XML文件示例。我正在寻找删除双节点的最佳方法(必要时),我尝试了许多技巧和方法:childNode.ParentNode.RemoveChild(childNode)
等,但我尝试的每种方法都不能正常工作(或我做错了什么,或者可能是因为DTD;我不确定)。好吧,我找到了另一种方法,我想:与其他人分享可能会很有趣。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root[
<!ELEMENT root (parent, child)>
<!ELEMENT parent (child)>
<!ELEMENT child EMPTY>
]>
<root>
<parent>
<child />
</parent>
<parent>
<child />
</parent>
<parent>
<child />
</parent>
</root>
答案 0 :(得分:1)
您的问题不是很清楚,但似乎您只想删除前两个节点之外的所有parent
个节点?
然后简单地说:
Dim xml = XDocument.Load(pathToLoad)
For Each parent in xml.<root>.<parent>.Skip(2).ToList()
parent.Remove()
Next
xml.Save(pathToSave)
答案 1 :(得分:0)
我使用Do
- Loop
代替For
- Next
,因为我在使用For
- Next
循环时出错:例如:已删除child
个节点以及parent
节点属性(在此示例中未显示)但仍保留parent
个节点。但是使用Do
- Loop
我得到了预期的结果(如果要删除除第一个节点之外的所有parent
个节点,则写入Loop Until i = 0
而不是Loop Until i = 1
在我的例子中,我需要前两个parent
个节点:
Dim i As Integer = MyXmlDocument.GetElementsByTagName("parent").Count - 1
Do
MyXmlDocument.DocumentElement.RemoveChild(MyXmlDocument.GetElementsByTagName("parent")(i))
i -= 1
Loop Until i = 1
MyXmlDocument.Save(MyXmlFile)
整个代码如下(我在模块中声明了'XmlReader','XmlSettings'和'XmlDocument',在模块之外可以使用它们。并且LoadSettings()
被调用Form.Load
事件。还有一件事情必须发生:当加载XmlDocument
时发生错误异常,XmlReader
保持打开状态。也许通过添加最后:MyXmlReader.Close()
,这个“问题”将被解决。
Public Module Common
Public MyXmlFile As String = My.Application.Info.DirectoryPath & "\Common\myxmlfile.xml"
Public MyXmlReader As Xml.XmlReader
Public MyXmlReaderSettings As New Xml.XmlReaderSettings
Public MyXmlDocument As New Xml.XmlDocument
Public Sub LoadSettings()
MyXmlReaderSettings.DtdProcessing = DtdProcessing.Parse
If File.Exists(MyXmlFile) Then
Try
MyXmlReader = Xml.XmlReader.Create(MyXmlFile, MyXmlReaderSettings)
MyXmlDocument.Load(MyXmlReader)
MyXmlReader.Close()
If MyXmlDocument.GetElementsByTagName("parent").Count > 2 Then
Dim i As Integer = MyXmlDocument.GetElementsByTagName("parent").Count - 1
Do
MyXmlDocument.DocumentElement.RemoveChild(MyXmlDocument.GetElementsByTagName("parent")(i))
i -= 1
Loop Until i = 1
MyXmlDocument.Save(MyXmlFile)
End If
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End If
End Sub
End Module