VB.net XML按标记名称

问题描述:

删除所有第二个元素我用下面的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

试试这个:

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

我的问题是两件事情,我是如何将我的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