2012-02-01 32 views
6

Tôi đang gọi một hàm trả về một chuỗi chứa dữ liệu XML. Làm thế nào chức năng này hoạt động không quan trọng nhưng xml kết quả có thể khác nhau tùy thuộc vào sự thành công của hàm.Kiểm tra XML để biết cấu trúc dự kiến ​​

Về cơ bản, hàm sẽ trả về XML mong đợi hoặc một định dạng lỗi XML. Dưới đây là những ví dụ cơ bản về những gì hai kết quả có thể trông giống như ...

On Success:

<SpecificResult> 
    <Something>data</Something> 
</SpecificResult> 

On Error:

<ErrorResult> 
    <ErrorCode>1</ErrorCode> 
    <ErrorMessage>An Error</ErrorMessage> 
</ErrorResult> 

Cách hệ thống của tôi được thiết lập là tôi có thể chuyển đổi chuỗi xml thành một lớp với hàm chuyển đổi đơn giản nhưng điều này đòi hỏi tôi phải biết loại lớp. Khi thành công, tôi sẽ biết đó là SpecificResult và tôi có thể chuyển đổi. Nhưng tôi muốn kiểm tra trước nếu xảy ra lỗi.

Kết quả cuối cùng lý tưởng sẽ cho phép một cái gì đó tương tự như sau ...

string xml = GetXML(); 
if(!IsError(xml)) 
{ 
    //convert to known type and process 
} 

Vậy câu hỏi được, cách tốt nhất để thực hiện các chức năng IsError là gì?

Tôi đã nghĩ đến một vài tùy chọn nhưng không chắc chắn nếu tôi thích ai trong số họ thực sự ...

  1. kiểm tra nếu chuỗi xml chứa "<ErrorResult>"
  2. cố gắng để chuyển đổi xml đến lớp ErrorResult và kiểm tra thất bại
  3. sử dụng XDocument hoặc tương tự được xây dựng trong các chức năng để phân tích cây và tìm kiếm ErrorResult nút

Trả lời

5

Kể từ khi phương pháp GetXml() là về cơ bản ret urning untyped dữ liệu và giả định an toàn duy nhất ở đây là nó có cấu trúc như XML, cách an toàn nhất để khẳng định loại thực tế của nó sẽ được phân tích nó như XML:

private bool IsError(string xml) 
{ 
    var document = XDocument.Parse(xml); 
    return document.Element("ErrorResult") != null; 
} 
+0

Nhờ điều này có vẻ đủ vững chắc để tôi. Chỉ cần để đảm bảo rằng msdn không rõ ràng trong tài liệu, một thất bại 'Parse' cố gắng vẫn sẽ trả về một XDocument (mặc dù một sản phẩm nào) chính xác? ... cũng, giữ cho câu trả lời được chấp nhận, sẽ chờ đợi để xem nếu những người khác có bất kỳ đầu vào;) – musefan

+1

[XDocument.Parse (string)] (http://msdn.microsoft.com/en-us/library/system. xml.linq.xdocument.parse.aspx) sẽ thực sự [ném một XmlException nếu nó gặp XML không hợp lệ] (http://msdn.microsoft.com/en-us/library/bb387040.aspx). Tuy nhiên, điều đó nghe có vẻ giống như một điều kiện * ngoại lệ thực sự trong trường hợp này, vì vậy bạn có thể không muốn xử lý điều đó trong phương thức 'IsError (string)' mà là cho phép ngoại lệ truyền bá thêm trong chuỗi cuộc gọi. –

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