Sẽ hữu ích nếu bạn có thể hiển thị một số mã mà bạn đã thử - sau đó ai đó có thể tìm hiểu thêm . Dù sao, bạn sẽ cần phải tham khảo một số hội đồng với các System.Xml.Linq
và mở không gian tên đầu tiên. Trong F # tương tác, bạn có thể viết nó như thế này (trong # dự án F, chỉ cần sử dụng Add Reference thoại):
#r "System.Core.dll"
#r "System.Xml.Linq.dll"
open System.Xml.Linq
Khi sử dụng XLinq trong F #, bạn cần một chức năng tiện ích đơn giản để chuyển đổi chuỗi để XName
đối tượng (đại diện cho tên phần tử/thuộc tính). Có một chuyển đổi tiềm ẩn trong C#, nhưng điều này thật đáng buồn không hoạt động trong F #.
let xn s = XName.Get(s)
Sau đó, bạn có thể tải tài liệu XML của bạn bằng cách sử dụng lớp XDocument
và sử dụng Element
phương pháp để có được một yếu tố "cha mẹ" duy nhất. Sau đó, bạn có thể gọi Elements
để có được tất cả các lồng nhau "sở hữu" các yếu tố:
let xd = XDocument.Load("file.xml")
let props = xd.Element(xn "parent").Elements(xn "property")
Bây giờ bạn có thể tìm kiếm các yếu tố để tìm ra một phần tử với giá trị thuộc tính xác định. Ví dụ sử dụng Seq.tryFind
(mà cũng cho phép bạn xử lý các trường hợp khi nguyên tố này không được tìm thấy):
let nameOpt = props |> Seq.tryFind (fun xe ->
xe.Attribute(xn "name").Value = "firstName")
Bây giờ, giá trị nameOpt
là loại option<XElement>
để bạn có thể mô hình phù hợp vào nó để xem nếu phần tử là được tìm thấy (ví dụ: Some(el)
) hoặc nếu nó không được tìm thấy (None
).
EDIT: Một cách khác để viết những dòng này là sử dụng biểu thức chuỗi và sau đó chỉ cần lấy phần tử đầu tiên (điều này không xử lý các trường hợp khi yếu tố không tìm thấy):
let nameEl =
seq { for el in xd.Element(xn "parent").Elements(xn "property") do
if xe.Attribute(xn "name").Value = "firstName" then yield xe }
|> Seq.head
Nguồn
2010-02-23 00:00:43
Bây giờ tôi cảm thấy ngu ngốc! Tôi nghĩ rằng điểm của việc sử dụng các biểu thức f # '' query {} '' và linq là, mà bạn có thể trừu tượng từ nguồn dữ liệu.Vì vậy, không thể như tôi thấy nó - là không có cách nào để làm một tiêu chuẩn '' truy vấn {cho foo trong xmlBar do ...} '' loại điều? – BitTickler
Lưu ý rằng bạn cũng cần tham chiếu System.Xml nếu nó chưa được tham chiếu – byteit101