2016-01-26 2 views
1

Я использую свой XMLReader для чтения XML-файлов, сгенерированных MS InfoPath, довольно долгое время. Теперь я сталкиваюсь с проблемой, что в разных родительских узлах есть несколько узлов с тем же сгенерированным именем, и мне нужно их разделить.Чтение определенного childNode из сгенерированного XML-файла с использованием vb.net

пример:

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 или мне действительно нужно отображать данные рекурсивно?

+0

Вы посмотрели [этот метод] (http://stackoverflow.com/a/241291/4747123), чтобы вытащить «xpath» из любого заданного узла? похоже, идеально подходит. – bri

ответ

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, на текущий элемент, с которым вы можете проверить.

+0

Это хорошо разработанное решение - к сожалению, оно не устраняет мою проблему с xPath. Кажется, что 'NodeType.Element' может искать только один элемент, а не целые xPaths. Это правда, или я чего-то не хватает? – GrindelOh

+0

@GrindelOh 'XmlReader' является только форвардом и не отслеживает состояние, например путь к текущему элементу (он предназначен для высокой производительности, а не для удобства) - поэтому переменные' path' и 'fullPath' используются выше для следите за этим. Если вы хотите найти произвольные элементы и документы не огромны, я бы рекомендовал использовать [LINQ to XML] (https://msdn.microsoft.com/en-us/library/bb387098.aspx) или 'XmlDocument' и [XPath] (https://msdn.microsoft.com/en-us/library/d271ytdx%28v=vs.110%29.aspx). – Mark

+0

@GrindelOh Еще одна вещь: 'fullPath' будет иметь полный путь к текущему элементу - вы не указали полную структуру своего XML, поэтому вам нужно будет соответствующим образом скорректировать эти проверки. – Mark