在XML文件中搜索并获取兄弟节点

时间:2016-11-22 09:03:48

标签: xml vb.net

我有包含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

1 个答案:

答案 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存在一些内置值转换。