2012-05-23 2 views
5

:XML 파일의 특정 노드에서 값을 가져 오는 방법은 무엇입니까? 이 XML 코드에서

<?xml version="1.0" encoding="utf-8"?> 
<Tabel> 
    <Member> 
    <Naam>Cruciatum</Naam> 
    <Kills>1000</Kills> 
    <Deaths>10</Deaths> 
    <KD>100</KD> 
    </Member> 
    <Member> 
    <Naam>Ghostbullet93</Naam> 
    <Kills>10</Kills> 
    <Deaths>1</Deaths> 
    <KD>10</KD> 
    </Member> 
</Tabel> 

어떻게 (예를 들어) 10 다음 <Kills>에받을 수 있나요?

나는 여러 가지를 시도했지만 성공하지 못했습니다. 이 코드를 사용하고 있었다 아이디어 하나 :

Dim doc = XDocument.Load("C:\members.xml") 
     Dim members = From m In doc.Element("Tabel").Elements("Member") 
         Select naam = m.Element("Naam").Value 
     For Each member In members 
      lstmembers.Items.Add(member) 
     Next 

그러나 내가 지금하는 데 필요한 작업 할 그 조각을 편집하는 방법을 알아낼 수 없습니다.

(위의 코드가 사용되는 경우에 대해 완벽하게 작동합니다.) 또한 요소의 값을 읽기 위해 XPath를 사용할 수

+0

리그 오브 레전드 또는 햄릿? – JWiley

+0

실제로 배틀 필드 3 : – Yorrick

답변

9

: 그러나, 당신은로드하고 사용하려는 경우

Dim doc As XmlDocument = New XmlDocument() 
doc.Load("C:\members.xml") 
Dim kills As String = doc.SelectNode("Tabel/Member[Naam='Ghostbullet93']/Kills").InnerText 

을 모든 데이터를 사용하는 경우 직렬화를 사용하는 것이 훨씬 쉬울 것입니다. 그렇게하려면 먼저 필요는 XML 구조를 모방 클래스를 만들 수 있습니다 (단순 위해 난 그냥 공공 문자열 필드를 사용합니다,하지만이 속성을 사용하는 것이 좋을 것이다) :

Public Class Member 
    Public Naam As String 
    Public Kills As Integer 
    Public Deaths As Integer 
    Public KD As Integer 
End Class 

Public Class Tabel 
    <XmlElement("Member")> _ 
    Public Members As List(Of Member) 
End Class 

는 다음과 같은 XML을 역 직렬화 이 :

Dim serializer As XmlSerializer = New XmlSerializer(GetType(Tabel)) 
Dim tabel As Tabel = CType(serializer.Deserialize(File.OpenRead("C:\members.xml")), Tabel) 
For Each member As Member in tabel 
    Dim kills As Integer = member.Kills 
Next 
+0

Purrrr-fect, thanks :) – Yorrick

+0

@Yorrick 직렬화를 사용하여 다른 옵션으로 답변을 업데이트했습니다. –

+0

직렬화로 모든 것을 1 행에 넣을 수 있습니까? 나는 네가 정확히 무슨 뜻인지 잘 모르겠다. 즉, 첫 번째 방법은 완벽하고 신속하게 작동합니다. 내가 수천 개의'을 가질 것 같지 않다.'노드로 끝나면 20-ish와 같습니다. – Yorrick

2

XPath 또는 XmlDeserialization 스티브 추천하는 훌륭한 옵션입니다,하지만 순수한 LINQ 솔루션을, 당신은 단지 쿼리에 적절한 Where 절을 추가해야합니다.

Dim doc = XDocument.Load("C:\members.xml") 
Dim members = From m In doc.Element("Tabel").Elements("Member") 
       Where m.Element("Naam").Value = "Ghostbullet93" 
       Select kills = m.Element("Kills").Value 

members 만 1 개체가있는 경우, 당신은 같은 것을 할 필요가 있으므로 여전히,이 예에서 IEnumerable<String> 될 것입니다 :

Dim member = members.First() // will throw exception if collection is empty 

또는

Dim member = members.Single() // will throw exception if collection is empty or has 2 or more elements 

(내 비주얼 베이직을 .NET은 매우 녹슬어서 구문 오류를 용서해주십시오.)

관련 문제