循环遍历XML节点并重用元素
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了循环遍历XML节点并重用元素相关的知识,希望对你有一定的参考价值。
我有这样的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
任何帮助赞赏!担
答案
使用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
另一答案
尝试使用XML Linq:
Imports System.Xml
Imports System.Xml.Linq
Module Module1
Const FILENAME As String = "c: emp est.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
以上是关于循环遍历XML节点并重用元素的主要内容,如果未能解决你的问题,请参考以下文章