2016-01-26 2 views
1

J'ai utilisé mon XMLReader pour lire des fichiers XML générés par MS InfoPath pendant un certain temps. Maintenant, je suis confronté au problème qu'il existe plusieurs nœuds avec le même nom généré dans différents nœuds parents et j'ai besoin de les séparer.Lecture d'un nœud enfant spécifique à partir d'un fichier XML généré à l'aide de vb.net

exemple:

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

C'est ce que je l'utilise jusqu'à présent pour rechercher s'il y a des éléments dans pc:DisplayName

Alors maintenant, j'ai cet élément dans plusieurs groupes. Ce qui signifie que si je continue à utiliser ce code toutes les personnes de tous les groupes seraient enregistrés dans projectteam

Malheureusement, il n'a pas travail avec le plein xPath:

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

est-il un autre moyen d'appeler à un childNode spécifique ou dois-je vraiment afficher les données de manière récurrente?

+0

Avez-vous regardé [cette méthode] (http://stackoverflow.com/a/241291/4747123) pour extraire le "xpath" d'un nœud donné? semble être un ajustement parfait. – bri

Répondre

1

XmlReader ne garde aucune trace du chemin pour chaque élément, mais vous pouvez suivre vous-même, peut-être quelque chose comme:

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 

La pile path est utilisé pour suivre le chemin de l'élément courant, et fullPath contient le chemin d'accès XPath à l'élément en cours que vous pouvez vérifier.

+0

Ceci est une solution bien élaborée - malheureusement, elle ne résout pas mon problème xPath. Il semble que 'NodeType.Element' ne peut rechercher qu'un seul élément et non pas des xPaths entiers. Est-ce vrai ou ai-je oublié quelque chose? – GrindelOh

+0

@GrindelOh 'XmlReader' est en avant seulement et ne suit pas l'état tel que le chemin vers l'élément courant (il est conçu pour une haute performance, pas de commodité) - donc les variables' path' et 'fullPath' sont utilisées ci-dessus pour suivre cela à la place. Si vous voulez trouver des éléments arbitraires, et que les documents ne sont pas énormes, je vous recommande d'utiliser [LINQ to XML] (https://msdn.microsoft.com/fr-fr/library/bb387098.aspx) ou 'XmlDocument' et [XPath] (https://msdn.microsoft.com/en-us/library/d271ytdx%28v=vs.110%29.aspx). – Mark

+0

@GrindelOh Une autre chose, 'fullPath' aura le chemin complet de l'élément actuel - vous n'avez pas montré la structure complète de votre XML, vous devrez donc ajuster ces contrôles comme il convient. – Mark