循环遍历XML节点并重用元素

问题描述 投票:0回答:2

我有这样的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米兰

或者,如果我可以迭代每个节点部分,我可以使用上面的stetic。

c元素的数量以及节点块的数量不固定。

最终编辑我想将XML内容写入数据库。数据库已修复并包含4列:

  • key>包含C值
  • hostname>包含每个块的c0元素值
  • datavalue>包含其键位置的c元素值
  • runkey>从变量读取的静态值

结果将如下所示:* c0 hostname hostname 200 * c1 hostname ip 200 * c2 hostname,200

任何帮助赞赏!担

xml vb.net xml-parsing
2个回答
0
投票

使用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

0
投票

尝试使用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
© www.soinside.com 2019 - 2024. All rights reserved.