2016-11-22 80 views
0

我曾經和一個包含filename及其checksum XML文件。我想獲得它的innerText。這是示例XML文件: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

你想看看XPath。您不需要編寫任何循環來從XML文檔中選擇某個節點。 – Tomalak

+1

@Tomalak所以這樣嗎?'doc.SelectNode( 「FileChecksums /文件[校驗= 'somechecksum'] /文件路徑」)。InnerText' – PapaBless

+1

沒錯! '//文件[checksum ='somechecks um']/filepath'會更方便一些。 – Tomalak

回答

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。

+0

此語法糖稱爲[XML軸屬性(https://msdn.microsoft.com/en-us/library/bb384769.aspx)。如果您創建並將您的xml文件模式添加到項目中 - 您也將獲得IntelliSense幫助 – Fabio