2017-08-30 76 views
2

刪除所有第二個元素我用下面的XML實例工作:VB.net XML按標記名稱

<order> 
    <name></name> 
    <etc></etc> 
    <etc></etc> 
    <components> 
     <component> 
      <sub></sub> 
     </component> 
     <component> 
      <sub></sub> 
     </component> 
     <component> 
      <sub></sub> 
     </component> 
     <component> 
      <sub></sub> 
     </component> 
    </components> 
</order> 

我試圖選擇並刪除每秒<component>,它在vb.net的sub秒。

下面是我到目前爲止有:

'make xmldocument object to hold xml string' 
Dim XMLDoc As New XMLDocument() 
XMLDoc.LoadXML(strXMLContent) 
'get all elements named component' 
Dim componentList As XmlNodeList = XMLDoc.GetElementsByTagName("Component") 
Dim c As Integer 
Dim i As Integer = 1 
'for every component element add i to itself to only get seconds' 
'and if on a second element, remove it and all sub elements inside it' 
For c = 0 To componentList.Count - 1 
    i += i 
    If i > 2 Then 
     componentList(c).ParentNode.RemoveChild(componentList(c)) 
    End If 
Next c 
'output to a string to see results' 
x &= XMLDoc.DocumentElement.OuterXml 

我遇到的問題是,我得到「Object reference not set to an instance of an object」當我運行這一點,在實際RemoveChild()被稱爲線。

+0

你能描述你遇到的問題嗎?你的問題不清楚哪裏出了問題。 – FluffyKitten

+0

當我運行這個時,我得到「對象引用未設置爲對象的實例」。我不確定在刪除孩子的路線上我應該使用什麼邏輯。 – Evohc

+0

您應該直接在問題中包含任何信息,因爲有些人可能會錯過評論。這次我爲你編輯了這個問題。這不是我的專業領域,我只是審查你的問題(所有的第一次問題都經過審查),所以現在看來​​是一個很好的問題,我會讓專家回答:) – FluffyKitten

回答

0

試試這個:

Private Function GetRidOfEveryOtherComponent(ByVal strXML As String) As String 
    'make xmldocument object to hold xml string' 
    Dim XMLDoc As New XmlDocument() 
    XMLDoc.LoadXml(strXML) 
    'get every other component item 
    Dim componentList As XmlNodeList = XMLDoc.SelectNodes("order/components/component[position() mod 2 = 1]") 
    For c As Integer = 0 To componentList.Count - 1 
     componentList(c).ParentNode.RemoveChild(componentList(c)) 
    Next c 
    'output to a string to see results' 
    Return XMLDoc.DocumentElement.OuterXml 
End Function 

很酷MOD功能是保羅的禮貌,在這裏:Selecting every other node uing XPATH

+0

我的實際滿的路徑在我的代碼中使用「soap:Envelope/soap:Body/SubmitOrder/Order/Components/Component [position()mod 2 = 1]」,從而導致此錯誤 - 需要System.Xml.XPath.XPathException:Namespace Manager或XsltContext。這個查詢有一個前綴,變量或用戶定義的函數 - 我知道我需要添加一個名稱空間,但是什麼部分? – Evohc

0

我的問題是兩件事情,我是如何將我的i整數,以及如果語句結構在合併時,使得我刪除的componentList(c)真的是空的。以下是我的工作修復程序。

'make xmldocument object to hold xml string' 
Dim XMLDoc As New XMLDocument() 
XMLDoc.LoadXML(strXMLContent) 
'get all elements named component' 
Dim componentList As XmlNodeList = XMLDoc.GetElementsByTagName("Component") 
Dim c As Integer 
Dim i As Integer = 0 
'for every "Component" element add 1 to i - remove every second by checking if i is modular' 
For c = 0 To componentList.Count - 1 
    i += 1 
    If Not i Mod 2 Then 
     componentList(c).ParentNode.RemoveChild(componentList(c)) 
    End If 
Next c 
'output to a string to see results' 
x &= XMLDoc.DocumentElement.OuterXml