2009-09-18 46 views
7

Tôi có tài liệu XML sau:Trích xuất một phần tử XML từ một file XML sử dụng XPath

<MimeType> 
    <Extension>.aab</Extension> 
    <Value>application/x-authorware-</Value> 
    </MimeType> 
    <MimeType> 
    <Extension>.aam</Extension> 
    <Value>application/x-authorware-</Value> 
    </MimeType> 

Toàn bộ tài liệu chứa khoảng 700 mục. Làm thế nào tôi có thể trích xuất một phần tử MimeType đơn bằng cách sử dụng XPath và đưa nó vào đối tượng C# MimeType được nhập mạnh?

+2

Bạn buộc phải không sử dụng .NET 3.5? Nếu bạn có thể sử dụng .NET 3.5 tôi sẽ sử dụng XDocument và LINQ to Xml, bạn sẽ thấy nó đơn giản hơn XPath. –

+0

Không nhất thiết. Tốt hơn nên sử dụng kết hợp cả hai: http://stackoverflow.com/questions/1294386/is-there-an-xpath-equivilent-for-linq-to-xml – Ryall

+0

có buộc vào góc .net 2. –

Trả lời

13

Sử dụng XmlDocument.SelectSingleNode.

Ví dụ:

XmlDocument doc = new XmlDocument(); 
doc.Load("yourXmlFileName"); 
XmlNode node = doc.SelectSingleNode("yourXpath"); 

Sau đó, bạn có thể truy cập node.ChildNodes để có được các giá trị bạn muốn (ví dụ):

string extension = node.ChildNodes[0].InnerText; 
string value = node.ChildNodes[1].InnerText; 

Và sau đó sử dụng những giá trị đó khi xây dựng đối tượng Loại Mime của bạn.

Chỉnh sửa: Một số thông tin XPath.
Có một số hướng dẫn thực sự tốt về XPath, hãy thử herehere. Bản thân số W3C recommendation có thể hơi áp đảo.
Ví dụ, bạn có thể thử bằng cách sử dụng XPath sau để chọn MimeType nút đầu tiên trong tài liệu (nơi root là bất cứ điều gì tên của phần tử gốc của bạn):

string xPath = "root/MimeType[1]" 

Hy vọng rằng sẽ giúp!

+0

Đoạn trích của Donut tổng hợp tất cả! Nó khó khăn hơn thế. Bạn có thể muốn kiểm tra trả lời của tôi cho bài đăng SO tại http://stackoverflow.com/questions/1440184/how-to-display-value-in-log-file-from-an-xml-file/1440642 cho một đoạn mã dài hơn biểu thị các điều kiện lỗi, những gì được trả về khi không tìm thấy ... – mjv

+0

ok Tôi sẽ cho phép điều này ... bất kỳ cơ hội nào nhận được một ví dụ XPath? Xin lỗi để được táo bạo? –

+0

Yep, thêm một số thông tin XPath (liên kết + ví dụ đơn giản) vào câu trả lời của tôi - hy vọng nó sẽ giúp. – Donut

2

Các phương pháp sau đây sẽ cung cấp một khuôn khổ để nhận được MIME Gõ đây

public MimeType RunXPath(string mimeType) 
{ 
    XmlNode node = _xmlDoc.SelectSingleNode(
    string.Format("//MimeType/Extension[text()="{0}"]/ancestor::MimeType", mimeType)); 
    foreach(XmlNode node in nodes) 
    { 
    // Extract the relevant nodes and populate the Mime Type here... 
    } 

    return ... 
} 

Bí quyết là để tìm Loại Mime dựa trên văn bản trong phần mở rộng, sau đó lấy tổ tiên của Loại Mime cho trận đấu này.

1

Theo dõi trên the answer by @MiffTheFox, bạn có thể sử dụng XPath cùng với LINQ to XML. Đây là một ví dụ dựa trên dữ liệu mẫu của bạn.

1) Thứ nhất, không gian tên bạn sẽ cần:

using System.Linq; 
using System.Xml; 
using System.Xml.Linq; 
using System.Xml.XPath; 

2) Tải tài liệu XML của bạn thành một XElement:

XElement rootElement = XElement.Parse(xml); 

3) Xác định XPath của bạn đường dẫn vị trí:

// For example, to locate the 'MimeType' element whose 'Extension' 
// child element has the value '.aam': 
// 
//  ./MimeType[Extension='.aam'] 

string extension = ".aam"; 
string locationPath = String.Format("./MimeType[Extension='{0}']", extension); 

4) Vượt qua con đường vị trí để XPathSelectElement() để chọn phần tử quan tâm:

XElement selectedElement = rootElement.XPathSelectElement(locationPath); 

5) Cuối cùng, trích xuất các giá trị Loại Mime được liên kết với phần mở rộng:

var mimeType = (string)selectedElement.Element("Value"); 
Các vấn đề liên quan