2015-02-06 201 views
0

下面是由根元素,父節點和子節點組成的XML文件的示例。我正在尋找消除節點雙擊的最佳方法(必要時),並且我嘗試了很多技巧和方法來完成它:例如childNode.ParentNode.RemoveChild(childNode)等,但是我嘗試過的每種方法都無法正常工作(或者我做了錯誤的事情,也可能是因爲DTD;我不確定)。那麼,我找到了一種替代方法來做到這一點,我想:或許與其他人分享可能很有趣。刪除雙重XML節點

<?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

雖然提出和回答你自己的問題是允許的,我們不鼓勵你保證的問題,本身是可以回答的問題** **。目前,我正在看這個,不知道「雙節點」是什麼意思。什麼使一個節點成爲雙重的?我假定你向我們展示的XML是輸入 - 相應的輸出應該是什麼,爲什麼?嘗試確保你的問題實際上描述了問題,*詢問*一個問題。 – 2015-02-06 07:48:24

回答

1

你的問題不是很清楚,但看起來你只是想刪除除前兩個之外的所有parent節點?

那麼怎麼樣簡單:

Dim xml = XDocument.Load(pathToLoad) 

For Each parent in xml.<root>.<parent>.Skip(2).ToList() 
    parent.Remove() 
Next 

xml.Save(pathToSave) 
+0

當我放置我的問題答案時,我編輯了原始代碼,並且在將原始變量名稱和節點名稱轉換爲更容易的時候,我犯了一個錯誤。 – LowLevel 2015-02-06 09:00:21

+0

是的。這不是一個問題。這是一個問答。 – LowLevel 2015-02-06 09:01:26

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保持打開狀態。也許通過添加finally:MyXmlReader.Close(),this 「問題」將得到解決。

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