2016-11-22 10 views
0

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>を取得したいと思い ':これはサンプルXMLファイルです。

これはコードです:(それが唯一のすべてのタグを読み込みます)

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/file [checksum = 'somechecksum']/filepath")。InnerText' – PapaBless

+1

まさに! '// file [checksum = 'somechecks um']/filepath'はもっと便利です。 – Tomalak

答えて

2

強大Linq-to-Xmlを使用してください。

これは、VB.NETのためのいくつかの素晴らしい構文糖を持っています。角括弧(<filepath>)でxml要素にアクセスできます。

また、名前が示唆するように、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 

XElementsのためのいくつかの組み込みの値の変換が存在するので、あなたも、最後の行に.Valueを省略することができます。

+0

[XML Axis Properties](https://msdn.microsoft.com/en-us/library/bb384769.aspx)という構文上の砂糖です。また、XMLファイルスキーマを作成してプロジェクトに追加すると、IntelliSenseのヘルプも表示されます – Fabio

関連する問題