我有包含filename
及其checksum
的Xml文件。我想得到它innerText
。这是示例xml文件:
<?xml version="1.0" encoding="utf-8"?>
<FileChecksums>
<file>
<filepath>930cdc93-5df2-4262-ba31-824e83404a2c.jpg</filepath>
<checksum>C4D9F0D47FF88130ABF0DA3C5351D71938C705F6602AE412D946AD5C74850837</checksum>
</file>
<file>
<filepath>7dd01bb9-3f35-442c-8840-1540632973f3.png</filepath>
<checksum>27EA8D4378DC8DB92F3D9ADA887E124BECAED47816FD3FFE49A4027362AF0FDC</checksum>
</file>
</FileChecksums>
如果<checksum>
的内部文字匹配,我希望得到相应的<filepath>
内部文字。
这是代码:(它只会读取所有标签)
Private Sub LocateFromChecksum(chksum As String)
Dim xmlDoc As New XmlDocument()
xmlDoc.Load("checksum.xml")
'search here?
For Each node As XmlNode In xmlDoc.DocumentElement.SelectSingleNode("checksum")
Debug.WriteLine(node.InnerText)
Next
End Sub
答案 0 :(得分:2)
使用强大的Linq-to-Xml。
它有一些很好的VB .NET语法糖,例如您可以使用尖括号访问xml元素:<filepath>
。
另外,顾名思义,您只需使用linq过滤xml。
示例:
Dim x As XDocument = XDocument.Load("checksum.xml")
Dim sampleChecksum = "27EA8D4378DC8DB92F3D9ADA887E124BECAED47816FD3FFE49A4027362AF0FDC"
Dim xFile = x.<FileChecksums>.<file>.Where(Function(c) c.<checksum>.Value = sampleChecksum)
'Or even (same result)':
xFile = x...<file>.Where(Function(c) c.<checksum>.Value = sampleChecksum)
If xFile.Any() Then
Debug.WriteLine(xFile.<filepath>)
End If
您甚至可以省略最后一行中的.Value
,因为XElements存在一些内置值转换。