Цикл по узлам XML и повторное использование элементов - PullRequest
0 голосов
/ 29 августа 2018

У меня есть такой XML

  <table>
  <header>
    <c0 type="string">name</c0>
    <c1 type="ip_address">last_ip_address</c1>
  </header>
  <body>
    <r>
      <c0>CHDB207</c0>
      <c1>172.18.151.57</c1>
  <c2>Locarno</c2>
   </r>
<r>
      <c0>CHDB100</c0>
      <c1>172.18.151.58</c1>
  <c2>Milan</c2>
   </r>
  </body>

Я хочу просмотреть все r элементов и получить результат, подобный

  • c0 chdb207 chdb207
  • c1 chdb207 172.18.151.57
  • c2 chfb207 Локарно
  • c0 chdb100 chdb100
  • c1 chdb100 172.18.151.58
  • c2 chdb100 Милан

Таким образом, для каждого цикла c0 следует повторно использовать в наборе результатов.

У меня есть следующий код в vb.net

Dim root2 As XmlElement = document.DocumentElement
Dim nodeList As XmlNodeList = document.SelectNodes("table/body/r/*")

For Each elem As XmlNode In nodeList
    MsgBox(elem.Name & " " & headerList(0).InnerXml & " " & elem.InnerXml)
Next

Моя проблема заключается в том, как выйти из цикла, когда все c-элементы узла повторяются, чтобы headerList (0) можно было записать как переменную, а не как статическую.

На данный момент мой результат выглядит так:

  • c0 chdb207 chdb207
  • c1 chdb207 172.18.151.57
  • c2 chfb207 Локарно
  • c0 chdb207 chdb100
  • c1 chdb207 172.18.151.58
  • c2 chdb207 Милан

В качестве альтернативы я мог бы использовать вышеприведенную стетику, если бы мог перебирать каждую секцию узла.

Число c-elemts не фиксировано, равно как и количество узловых узлов.

Редактировать В конечном итоге я хочу записать содержимое XML в базу данных. База данных исправлена ​​и содержит 4 столбца:

  • ключ> содержит значение C
  • hostname> содержит значение элемента c0 каждого блока
  • datavalue> содержит значение элемента c в его ключевой позиции
  • runkey> статическое значение, считанное из переменной

Результат будет выглядеть так: * c0 hostname hostname 200 * c1 имя хоста ip 200 * имя хоста c2 независимо от 200

Любая помощь приветствуется! Дан

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Попробуйте использовать XML Linq:

Imports System.Xml
Imports System.Xml.Linq
Module Module1
    Const FILENAME As String = "c:\temp\test.xml"
    Sub Main()
        Dim doc As XDocument = XDocument.Load(FILENAME)

        Dim results = doc.Descendants("body").FirstOrDefault() _
                .Elements("r").Select(Function(x) New With { _
                    .c0 = x.Element("c0").Value,
                    .c1 = x.Element("c1").Value,
                    .c2 = x.Element("c2").Value
                }).ToList()
    End Sub

End Module
0 голосов
/ 29 августа 2018

Решение с использованием LINQ.

Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml
Imports System.Xml.Linq

Public Module Module1
    Public Sub Main()
        Dim xml = 
            <table>
                <header>
                    <c0 type="string">name</c0>
                    <c1 type="ip_address">last_ip_address</c1>
                </header>
                <body>
                    <r>
                        <c0>CHDB207</c0>
                        <c1>172.18.151.57</c1>
                        <c2>Locarno</c2>
                    </r>
                    <r>
                        <c0>CHDB100</c0>
                        <c1>172.18.151.58</c1>
                        <c2>Milan</c2>
                    </r>
                </body>
            </table>

        Dim xmlString = System.Xml.Linq.XDocument.Parse(xml.ToString())

        Dim nodes =
            From el In xmlString.<table>.<body>.<r>
            Select el

        For Each node In nodes
            Dim nodeDescendants =
                From nd In node.Descendants
                Select nd

            Dim header = nodeDescendants(0).Value
            For Each nd In nodeDescendants
                Console.WriteLine("{0} {1} {2}", nd.Name, header, nd.Value)
            Next
        Next
    End Sub
End Module

Протестировано в LINQPad и dotnetfiddler.net, результат:

c0 CHDB207 CHDB207
c1 CHDB207 172.18.151.57
c2 CHDB207 Locarno
c0 CHDB100 CHDB100
c1 CHDB100 172.18.151.58
c2 CHDB100 Milan
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...