删除双XML节点

时间:2015-02-06 07:36:56

标签: xml vb.net dtd

以下是由根元素,父节点和子节点组成的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>

2 个答案:

答案 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