2012-06-27 32 views
18

Tôi muốn truy vấn đối tượng XDocument cho một đường dẫn cụ thể, (ví dụ: "/ path/to/element/I/want") nhưng tôi không biết cách tiếp tục.Làm cách nào để truy vấn XDocument bằng 'đường dẫn'?

+0

có thể trùng lặp [cách sử dụng XPath với XDocument?] (Http://stackoverflow.com/questions/6209841/how-to-use-xpath-with -xdocument) –

+0

Bạn có thể xem ví dụ về các đường dẫn khác nhau, có/không có định nghĩa vùng tên, v.v. tại đây: http://stackoverflow.com/a/38272604/5838538. – Jelgab

Trả lời

2

soemthing tương tự như điều này có thể làm việc:

var path = "/path/to/element/I/want"; 
var route = path.Split(new []{'/'}, StringSplitOptions.RemoveEmptyEntries); 

XElement result = null; 
foreach (var node in route) 
{ 
    if (result == null) 
    { 
     result = _xmlDocument.Element(node);  
    } 
    else 
    { 
     result = result.Element(node); 
    } 
} 

return result; 
+1

'RemoveEmptyEntries' không phải là một ý tưởng hay,' // 'có một ý nghĩa cụ thể trong XPath và nó tìm kiếm tất cả các hậu duệ. – svick

41

Bạn có thể sử dụng phương pháp từ System.Xml.XPath.Extensions để làm điều này.

Ví dụ, nếu bạn muốn chọn một yếu tố duy nhất, bạn sẽ sử dụng XPathSelectElement():

var element = doc.XPathSelectElement("/path/to/element/I/want"); 

Các truy vấn không phải là con đường đơn giản như những gì bạn mô tả, họ sử dụng ngôn ngữ XPath.

+6

Trong 4.5, hãy sử dụng System.Xml.XPath. – lionheart

+6

@lionheart Đó không phải là chính xác những gì tôi đề nghị? Và không gian tên 'System.Xml.XPath' chắc chắn không phải là mới trong .Net 4.5. – svick

4

Mặc dù đây là một bài hơi cũ, cần lưu ý rằng LINQ-to-XML có thể được sử dụng như là một thay thế cho System.XML.XPath để tìm các yếu tố dựa trên một con đường trong một Ví dụ XDocument

:

var results = x.Elements("path").Elements("to").Elements("element").Elements("I").Elements("want").FirstOrDefault(); 

Lưu ý: Lệnh LINQ to XML có thể cần phải được thay đổi để phù hợp với cấu trúc thực tế và/hoặc cardinality của XML.

https://msdn.microsoft.com/en-us/library/bb675156.aspx

0

Tôi cần làm điều tương tự. Điều này repo có một số bài kiểm tra đơn vị demoing truy vấn XDocument với XPathEvaluate()

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