2009-04-07 31 views
13

Tôi đang xác thực đối với XMLSchema trong Java và nhận SAXParseExceptions được ném khi tôi có các mô hình nội dung không hợp lệ.Cách sử dụng SAXParseException hiệu quả trong Java

Tôi sẽ sử dụng những ngoại lệ này để làm nổi bật nơi xác thực không thành công - nhưng SAXParseExceptions có vẻ hơi quá thấp.

Ví dụ, nếu thất bại trong điều tra, tôi nhận được lỗi hợp lệ mà giá trị được cung cấp không khớp với mô hình nội dung trong một ngoại lệ và phần tử được áp dụng trong trường hợp tiếp theo.

Tôi nghĩ rằng tôi cần phải có một tiện ích tóm tắt một chút để hợp nhất các lỗi liên quan với nhau và phân tích văn bản ngoại lệ thành các thuộc tính ngoại lệ có thể sử dụng được.

Đây có phải là cách tiếp cận hợp lý hay tôi chỉ thiếu một thứ gì đó hoặc có thể là thư viện hoặc lớp trợ giúp?


Cập nhật @timgilbert, cảm ơn phản hồi.

Ví dụ, một SAXParseException tôi tìm thấy trên t'internet

cvc-pattern-valid: Value 'en' is not facet-valid 
with respect to pattern '([a-zA-Z]{1,8})(-[a-zA-Z0-9]{1,8})*' 

Những điều quan trọng đối với tôi là

  • tử 'en' mà ngoại lệ này được áp dụng. Tại sao tôi không thể gọi exception.getElement() hoặc một cái gì đó, và tại sao không phải là XPath cho phần tử được đề cập? Hữu ích hơn với tài liệu trong bộ nhớ hơn số dòng và số cột!
  • Đó là lỗi xác thực mẫu. Tại sao tôi không thể nhận được một cái gì đó giống như một liệt kê các loại thất bại có thể và một tham chiếu đến một trong những thích hợp?
  • Mẫu thực tế xác thực không thành công.
  • Sẽ được ngoại lệ khác ném bên cạnh cho tôi biết giá trị của phần tử 'en' đã gây ra vấn đề mà tôi cần phải hợp nhất

Một ví dụ về những gì tôi muốn để có thể làm là có người gửi tài liệu và có tài liệu được đánh dấu khi xác thực không thành công với thông điệp thân thiện với người dùng - thông báo lỗi trên kinda dường như không thân thiện ... phải phân tích bằng dấu nháy đơn chỉ cảm thấy giống như một tai nạn đang chờ xảy ra :)

Tôi nghĩ rằng tôi có thể làm điều đó sai với điều 'tham chiếu đến yếu tố', và có lẽ tôi phải có một biến đổi nhận dạng của tài liệu theo mặc định như một phần của xác nhận hợp lệ, và augmen t việc chuyển đổi với các thuộc tính lỗi xác thực mà tôi có thể chọn với CSS. Điều đó vẫn không giúp được gì nếu tôi cần phải phân tích các tin nhắn để làm cho chúng trở nên thân thiện hơn ...

ràng buộc chặt chẽ, javax.xml.validation.Validator.validate() ném org.xml.sax.SAXException anyway - không chắc chắn làm thế nào tôi có thể thoát khỏi sự ràng buộc giả ...

Cheers

+1

+1, tôi vừa gặp phải cùng loại sự cố vào sáng sớm hôm nay. Cảm ơn vì đăng. –

+1

Không vấn đề gì, vui mừng không phải chỉ mình tôi câm! – Brabster

+0

Tôi có một vấn đề rất giống nhau. Bạn đã tìm thấy giải pháp giúp dễ dàng hơn trong việc làm cho các lỗi này thân thiện với người dùng hơn? – Turismo

Trả lời

2

tôi không hoàn toàn rõ ràng về những gì bạn đang yêu cầu ở đây, có thể bạn có thể cung cấp chi tiết hơn một chút về những gì bạn có nghĩa là do các ngoại lệ quá thấp? Có phải bản thân các thông báo lỗi không thể hiểu được?

Lớp SaxParseException có phương thức getColumnNumber() và getLineNumber() mà bạn có thể trình bày cho người dùng để giúp họ sửa lỗi.Một điều mà bạn có thể thử nghiệm là sử dụng các triển khai phân tích cú pháp XML khác nhau - mỗi trình phân tích cú pháp sẽ phát hiện lỗi khi tìm mã không hợp lệ, nhưng các triển khai khác nhau có thể có các thông báo lỗi và chuỗi ngoại lệ khác nhau.

Thực ra, vì lý do này tôi không rõ ràng về việc cố xây dựng một thư viện kiểm tra chuỗi ngoại lệ và cố gắng xây dựng một thông báo lỗi chặt chẽ hơn, vì bạn sẽ ghép mã của bạn khá chặt chẽ với chi tiết cụ thể về triển khai phân tích cú pháp XML (đặc biệt nếu bạn đang dựa vào sự phân biệt cụ thể của các thông báo lỗi).

(Xin lỗi này không phải là cụ thể hơn, có lẽ bạn có thể cho một ví dụ về vấn đề bạn đang nhìn thấy?)

1

Brabster tôi cũng phải đối mặt với vấn đề tương tự đường trở về nơi tôi cần phải nói cho mà phần tử trong xml lỗi đã đến. Tôi đã giải quyết được vấn đề một chút bằng cách duy trì một ngăn xếp trong trình xử lý SAX Parser của tôi. Trong phương thức startElement tôi đẩy qName (tên của phần tử) trong ngăn xếp và trong phương thức endElement, tôi bật qName từ ngăn xếp.

Bất cứ khi nào ngoại lệ xảy ra, ngăn xếp của tôi đại diện cho XPath đầy đủ của phần tử.

Vấn đề duy nhất là nếu có nhiều phần tử có cùng tên thì bạn không biết lỗi là phần tử nào. Nhưng ít nhất các chi tiết XPath đầy đủ đã giúp cùng với LineNumber và ColumnNumber.

Hy vọng điều này sẽ hữu ích.

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