2008-12-09 39 views
7

Tôi đang cố gắng để tìm kiếm nhiều thuộc tính trong XML:Tìm qua nhiều thuộc tính trong XML

<APIS> 
    <API Key="00001"> 
    <field Username="username1" UserPassword="password1" FileName="Filename1.xml"/> 
    <field Username="username2" UserPassword="password2" FileName="Filename2.xml"/> 
    <field Username="username3" UserPassword="password3" FileName="Filename3.xml"/> 
    </API> 
</APIS> 

Tôi cần phải kiểm tra xem trong "lĩnh vực" Username VÀ UserPassword giá trị được cả những gì tôi đang so sánh với tôi Giá trị tập dữ liệu, là có một cách mà tôi có thể kiểm tra nhiều thuộc tính (và điều kiện) mà không cần viết logic của riêng tôi sử dụng cờ và phá vỡ vòng lặp.

Có chức năng tích hợp trong XMLDoc không? Bất kỳ trợ giúp sẽ được đánh giá cao!

+0

Hai điểm. Đầu tiên, XML không hợp lệ. Thứ hai, bạn đang sử dụng ngôn ngữ/môi trường nào? Ví dụ, tôi biết làm thế nào để làm điều này trong C# ... –

+0

XML không hợp lệ (
thẻ) chỉ đơn thuần là vì anh ta không biết làm thế nào để định dạng một cái gì đó như mã. Tôi đã sửa nó. – Tomalak

Trả lời

25

Để tìm kiếm cho những gì bạn muốn trong đoạn XML mà bạn cung cấp, bạn sẽ cần các biểu thức XPath sau:

/APIS/API/field[@Username='username1' and @UserPassword='password1'] 

này hoặc là sẽ trở lại một cái gì đó, nếu tên người dùng và mật khẩu phù hợp - hay không nếu họ không.

Cấm biểu thức XPath chỉ là một chuỗi - bạn có thể xây dựng nó động với các giá trị được nhập vào một trường biểu mẫu, ví dụ.

Nếu bạn cho biết bạn đang ở trong ngôn ngữ/môi trường nào, các mẫu mã được đăng ở đây có thể sẽ cụ thể hơn.

Đây là một cách để làm điều đó trong C# (VB.NET tương tự):

// make sure the following line is included in your class 
using System.Xml; 

XmlDocument xmldoc = new XmlDocument(); 
xmldoc.Load("your XML string or file"); 

string xpath = "/APIS/API/field[@Username='{0}' and @UserPassword='{1}']"; 
string username = "username1"; 
string password = "password1"; 

xpath = String.Format(xpath, username, password); 
XmlNode userNode = xmldoc.SelectSingleNode(xpath); 

if (userNode != null) 
{ 
    // found something with given user name and password 
} 
else 
{ 
    // username or password incorrect 
} 

Hãy nhận biết rằng không phải tên người dùng hay mật khẩu có thể chứa dấu nháy đơn, hoặc ví dụ trên sẽ thất bại. Đây là some info on this peculiarity.

Ngoài ra còn có một Làm thế nào-Để từ Microsoft sẵn: HOW TO: Use the System.Xml.XmlDocument Class to Execute XPath Queries in Visual C# .NET

2

Tìm kiếm XML là những gì XPath được tạo cho. Bạn không chỉ định ngôn ngữ bạn đang sử dụng, nhưng là here's an article khi xử lý XML bằng XPath trong Java và here's one bằng C#.

1

Đây là một hỏi thường gặp về XPath biểu.

Một hoặc nhiều biểu thức XPath (có kiểu đánh giá là boolean), có thể được kết nối với nhau bằng cách sử dụng boolean operators "và" và "hoặc" và sử dụng hàm XPath not().

Lưu ý rằng tất cả các tên này đều nằm trong trường hợp thấp hơn. XPath phân biệt chữ hoa chữ thường và cách viết hoa khác của các tên này (chẳng hạn như "AND") sẽ không được công nhận là tên của toán tử logic.

Vì vậy, trong trường hợp đặc biệt này, các biểu thức XPath truy nã sẽ được một cái gì đó như sau:

/*/*/field[@Username = your-ds-username and @UserPassword = your-ds-UserPassword]

nơi your-ds-usernameyour-ds-UserPassword nên được thay thế bằng các giá trị tương ứng bạn muốn sử dụng từ tập dữ liệu.

+0

Tại sao sử dụng "/ */*" (trái ngược với "//")? Tôi nghĩ - khi bạn không rõ ràng về các tên phần tử, bạn cũng có thể không rõ ràng về chiều sâu làm tổ. Hay tôi bỏ qua điều gì đó? – Tomalak

+0

@Tomalak: Tránh chữ viết tắt "//" vì nó làm cho cây tài liệu hoàn chỉnh được tìm kiếm. Khi chúng ta biết cấu trúc của tài liệu, chúng ta có thể chỉ định các mức và tên cần thiết. Trong trường hợp này, tên là tên duy nhất xảy ra ở một mức độ, do đó, nó là hiệu quả hơn không để kiểm tra cho một tên –

0

Để tìm kiếm nhiều thuộc tính trong trường hợp thẻ XML, chúng ta có thể sử dụng sau đây XPATH /API/API/lĩnh vực [@ Username = 'USERNAME1'] [@ UserPassword = 'password1']

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