2012-05-23 37 views
5

Từ mã XML này:Làm cách nào để lấy giá trị từ một nút cụ thể trong tệp 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> 

Làm thế nào tôi có thể nhận được (ví dụ) 10 bên cạnh <Kills>?

Tôi đã thử nhiều thứ mà không thành công. Một trong những ý tưởng tôi đã được sử dụng mã này:

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 

Nhưng tôi không thể tìm ra cách để chỉnh sửa mà đoạn để làm việc với những gì tôi cần nó để làm gì bây giờ.

(Đoạn mã trên hoạt động hoàn hảo cho nơi nó được sử dụng.)

+0

League of Legends hoặc Hamlet? – JWiley

+0

Chiến trường 3 thực sự :) – Yorrick

Trả lời

9

Bạn cũng có thể sử dụng XPath để đọc giá trị của phần tử:

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

Tuy nhiên, nếu bạn có ý định để tải và sử dụng tất cả các dữ liệu, nó sẽ dễ dàng hơn để sử dụng tuần tự hóa. Để làm điều đó, trước tiên bạn cần để tạo ra các lớp học bắt chước cấu trúc XML (vì đơn giản vì tôi sẽ chỉ sử dụng các trường public string, nhưng nó sẽ là tốt hơn để sử dụng tài sản):

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 

Sau đó deserialize XML như này:

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, cảm ơn :) – Yorrick

+0

@Yorrick Tôi đã cập nhật câu trả lời của mình bằng một tùy chọn khác sử dụng tuần tự hóa. –

+0

Serialization như trong việc đưa tất cả vào 1 hàng? Tôi không hoàn toàn chắc chắn như những gì bạn có ý nghĩa chính xác. Điều đó đang được nói, phương pháp đầu tiên hoạt động hoàn hảo và nhanh chóng. Nó không giống như tôi sẽ có hàng ngàn '. 'nút, chỉ như 20-ish cuối cùng. – Yorrick

2

XPath hoặc XmlDeserialization một khuyến cáo của Steve những lựa chọn tuyệt vời, nhưng đối với một giải pháp thuần túy LINQ, bạn chỉ cần thêm một khoản thích hợp Where để truy vấn của bạn.

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 vẫn sẽ là một IEnumerable<String> trong ví dụ này, vì vậy nếu bạn chỉ có 1 đối tượng, bạn cần phải làm điều gì đó như:

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

hoặc

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

(vb của tôi .NET cực kỳ gỉ, vì vậy hãy tha thứ cho bất kỳ lỗi cú pháp nào).

Các vấn đề liên quan