2012-04-01 42 views
6

Tôi đang làm việc với nhiều đối tượng XElement để cung cấp một số dữ liệu do người dùng chỉ định cho một số đối tượng trong thư viện của tôi. Tôi đang cố gắng tránh xác định cấu trúc của toàn bộ tệp XML vì thư viện không nên quan tâm toàn bộ XML trông như thế nào miễn là các phần tử cụ thể mà nó cần được cấu trúc đúng.Xác thực lược đồ XML của XElement

Để kết thúc, tôi có 3 tệp XSD riêng biệt xác định lược đồ cho từng nhu cầu của lớp của tôi, tuy nhiên tôi đang gặp phải một số vấn đề xác thực XElement dựa vào lược đồ. Có vẻ như không phải là một phương pháp để làm điều đó mà không có một workaround.

Từ trang MSDN, phương thức mở rộng XElement.Validate() dường như được thiết kế để xác thực lại các phần tử con của tệp lớn hơn. Đối số XmlSchemaObject gây ra sự cố của tôi vì tôi không thể giả định nó sẽ có mặt trong bất kỳ số XElements nào. Tôi nghĩ rằng tôi có thể giải quyết vấn đề này bằng cách lấy số XmlSchemaElement từ số XmlSchemaSet của mình để vượt qua đối số XmlSchemaObject, nhưng vì XmlSchemaSet đã xác định mọi thứ, có vẻ lạ khi phải làm điều đó.

Có tùy chọn nào tốt hơn để xác thực XElement bằng lược đồ mà không cần xác thực toàn bộ số XDocument không? Hoặc tôi chỉ cần để cho lớp kinh doanh xử lý xác nhận lược đồ trong ứng dụng và để cho thư viện giả định rằng XElement được tạo đúng cách (tôi coi tùy chọn này, nhưng sở thích cá nhân thích tránh ném ngoại lệ và thay vào đó chỉ để phương thức gọi biết rằng XElement không hợp lệ qua tham số trả về).

Trả lời

9

Tôi hiểu vấn đề bạn gặp phải với API được cung cấp, theo như tôi thấy bạn có hai tùy chọn, một là để đặt XElement của bạn vào một XDocument với ví dụ: XDocument doc = new XDocument(xElementToValidate); và sau đó gọi the Validate method on that XDocument nơi tất cả những gì bạn phải vượt qua là XmlSchemaSet, tùy chọn thứ hai là cách bạn phác thảo chính mình, cụ thể là sử dụng phương pháp Validate của XElement, đảm bảo bạn vượt qua trong XmlSchemaSet và định nghĩa phần tử gốc lược đồ đó được đặt là XmlSchemaObject. Nếu đây là các lược đồ đơn giản chỉ với một định nghĩa phần tử cấp cao nhất, tất cả những gì bạn phải làm là ví dụ:

XmlSchemaSet schemaSet = new XmlSchemaSet(); 
    schemaSet.Add(null, "schema.xsd"); 
    schemaSet.Compile(); 

    XmlSchemaObject schemaObject = schemaSet.GlobalElements.Values.OfType<XmlSchemaObject>().First(); 

Nếu bạn quấn một trong hai phương pháp tiếp cận vào một phương pháp thì không cần nỗ lực nhiều hơn là gọi một phương thức tiện lợi tương tự.

+0

Tôi không biết tại sao tôi không nghĩ đến việc gói mã trong phương thức mở rộng 'XElement.Validate()' của riêng mình. Dường như hợp lý bây giờ bạn nói điều đó. Việc tạo một 'XDocument' là một ý tưởng hay khác đáng lẽ đã xảy ra với tôi (tôi đã dành quá nhiều thời gian để tìm ra cách chuyển đổi nó, và tôi đã bỏ lỡ giải pháp hiển nhiên). Tôi sẽ thử nghiệm với cả hai và xem mà tôi thích. – psubsee2003

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