使用vb.net从生成的XML - File中读出特定的childNode

时间:2016-01-26 14:21:06

标签: c# xml vb.net xpath infopath

我一直在使用我的XMLReader读取MS InfoPath生成的XML文件很长一段时间。现在我面临的问题是,在不同的父节点中有多个节点具有相同的生成名称,我需要将它们分开。

示例:

If .NodeType = XmlNodeType.Element Then
     If .Name = "pc:DisplayName" Then
          projectteam &= vbTab
          pteamDataset = True
     End If 
End If

到目前为止,我使用这个来搜索pc:DisplayName

中是否有任何元素

所以现在我在几个小组中都有这个元素。这意味着如果我仍然使用此代码,则所有组中的所有人都将保存到projectteam

可悲的是使用完整的xPath:

If .Name = "my:projectteam1/pc:person/pc:DisplayName" Then
projectteam1 &= vbTab
If .Name = "my:projectteam2/pc:person/pc:DisplayName" Then
projectteam2 &= vbTab

是否有其他方法可以调用特定的childNode,还是我必须以递归方式显示数据?

1 个答案:

答案 0 :(得分:1)

XmlReader没有跟踪每个元素的路径,但您可以自己跟踪它,可能是这样的:

Dim path = New Stack(Of String)()
Using r = New XmlTextReader(...)
    While r.Read()
        If r.NodeType = XmlNodeType.Element Then
            path.Push(r.Name)
            Dim fullPath = String.Join("/", path.Reverse())
            ' May need .EndsWith, since root element will be in path?
            If fullPath = "my:projectteam1/pc:person/pc:DisplayName" Then
                projectteam1 &= vbTab
            ElseIf fullPath = "my:projectteam2/pc:person/pc:DisplayName" Then
                projectteam2 &= vbTab
            End If
        ElseIf r.NodeType = XmlNodeType.EndElement Then
            path.Pop()
        End If
    End While
End Using

path堆栈用于跟踪当前元素的路径,fullPath包含可以检查的当前元素的类似XPath的路径。