2010-03-26 35 views
7

Tôi đang sử dụng Dịch vụ web của bên thứ ba có định nghĩa và triển khai nằm ngoài tầm kiểm soát của tôi. Dịch vụ web này sẽ thay đổi trong tương lai.Tự động trích xuất XSD nội tuyến từ WSDL sang tệp XSD (s)

Dịch vụ web nên được sử dụng để tạo tệp XML chứa một số dữ liệu giống nhau (được biểu thị bằng cùng loại XSD) làm Dịch vụ web cộng với một số thông tin bổ sung do chương trình tạo.

cách tiếp cận của tôi:

  1. tạo XSD của riêng tôi đề cập đến các định nghĩa XSD của WSDL của dịch vụ web được gọi là
  2. sử dụng Java (XSD này cũng bao gồm các loại XSD cho các thông tin thêm rõ ràng.) Khung dữ liệu XML (như ADB hoặc JiXB) để tạo các lớp databinding từ tệp XSD của riêng tôi từ bước 1
  3. sử dụng khung công tác SOAP Java (như Axis2 hoặc CXF) với cùng khung dữ liệu để tạo các lớp databinding từ WSDL (Điều này sẽ cho phép tôi sử dụng các đối tượng được truy xuất bởi dịch vụ web trực tiếp trong generati trên XML.)

Loại XSD tôi sẽ sử dụng trong tệp XSD của riêng tôi, nhưng được xác định trong WSDL, có thể thay đổi. Bất cứ khi nào họ thay đổi, tôi muốn tự động xử lý dữ liệu XSD và WSDL một lần nữa. (Nếu thay đổi là đủ quan trọng, điều này có thể gây ra một số nỗ lực phát triển (Nhưng thường không)..)

Vấn đề của tôi:

Trong bước 1 Tôi cần một XSD đề cập đến các loại tương tự như sử dụng bởi các Web Dịch vụ.

WSDL đang đề cập đến một WSDL khác, đang đề cập đến một WSDL khác vv. Cuối cùng có một WSDL với các loại XSD nội tuyến cần thiết. Theo như tôi biết không có cách nào để trực tiếp tham khảo các loại XSD nội tuyến của một WSDL từ một XSD.

Cách tiếp cận mà tôi nghĩ là khả thi nhất, là bao gồm thêm một bước trong quá trình xử lý tự động (trước khi dữ liệu) trích xuất XSD nội tuyến từ WSDL sang tệp XSD khác. Các tệp XSD khác sau đó có thể được tham chiếu bởi tệp XSD của riêng tôi.

Những điều tôi muốn tránh:

  • thủ sao chép dán XSD inline vào một tập tin XSD
  • Bất kỳ bước thủ công (Giống như việc xác định (Tôi đang tìm kiếm một quá trình tự động.). WSDL chứa các loại nội tuyến theo cách thủ công. (Vị trí của WSDL đó cũng thay đổi.))
  • Sử dụng xsd: bất kỳ trong XSD của riêng tôi. Tôi muốn tập tin XSD của riêng tôi là chính xác.
  • Sử dụng một công nghệ không phải Java (như NET)
  • một lượng lớn thực hiện (nhưng gợi ý về cách bạn sẽ thực hiện một khai thác như thế nào được hoan nghênh)

PS: Tôi tìm thấy một số câu hỏi tương tự, nhưng tất cả họ đều có phản ứng như: WTH bạn có muốn làm điều đó không? Đó là lý do cho câu chuyện nền tảng khá lớn của tôi.

Trả lời

3

Tôi không biết bất kỳ thư viện nào có thể làm điều này cho bạn, nhưng chắc chắn có thể thực hiện được với một chút nỗ lực (~ 200 dòng).Một chương trình meta thô để tạo tất cả XSD nội tuyến và bao gồm:

method processWSDL(Document wsdl) { 
    for each ("/wsdl:definitions/wsdl:types/xsd:schema" in wsdl) { 
     call processXSD("inline_[i].xsd",".") 
    } 
    for each ("/wsdl:definitions/wsdl:import" in wsdl) { 
     Document x = read and parse ("@location") 
     if (x is WSDL) call processWSDL(x) 
     else if (x is XSD) call processXSD("@location", x) 
    } 
} 

method processXSD(String filename, Document xsd) { 
    write "xsd" to a new file "filename" // if 'filename' is a URL, take only the part after the last '/' 
    for each ("/xsd:schema/xsd:import" or "/xsd:schema/xsd:include" in xsd) { 
     if ("@schemaLocation" is local reference) {  // no 'http://' prefix 
      Document x = read and parse ("@schemaLocation") 
      call processXSD("@schemaLocation", x) 
     } 
    } 
} 

Đây không phải là giải pháp đầy đủ, ví dụ: không xử lý các tiền tố không gian tên được định nghĩa bên ngoài lược đồ nội tuyến, nhưng hy vọng sẽ mang lại một điểm khởi đầu tốt.

+0

Tôi đã đoán rằng điều gì đó như thế này là cần thiết. Tôi đã thực sự hy vọng cho một cái gì đó thêm khuôn khổ như: ** cho (XmlSchema xmlSchema: wsdl.extractNamespaceSchemas()) xmlSchema.writeFile (ns2FileName (xmlSchema.getTargetNamespace())); ** Aah, một thế giới không hoàn hảo ... –

+0

@Steven : âm thanh như một cơ hội cho một dự án nguồn mở để mang thế giới đến gần hơn một chút để hoàn thiện ;-) –

2

Chỉ để giữ cho bài đăng này có liên quan, mọi thứ đã thay đổi kể từ khi câu trả lời được chấp nhận. Bây giờ có thể trong Java để tạo ra những gì bạn muốn bắt đầu từ WSDL; JAX-WS cung cấp công cụ wsimport thực hiện chính xác những gì được yêu cầu: lấy WSDL, tạo proxy máy khách cùng với một loạt các lớp được chú thích JAXB để hủy/marshalling các yêu cầu.

Tôi muốn nói rằng, với điểm @MoizTankiwala, rằng cần phải xuất nội dung XSD từ WSDL (hoặc bao gồm tất cả nội dung XSD bên ngoài bên trong phần loại WSDL) vẫn còn sống.

Trước đây là điều có ý nghĩa khi ai đó có một lượng lớn XSD, và có mối lo ngại chung về quản lý hiệu quả, phân tích và phát triển mô hình đó trong XSD.

Sau này cũng được tìm kiếm sau khi một số ngôn ngữ động (chủ yếu) vẫn thiếu hỗ trợ đầy đủ thổi từ công cụ khi nói đến WSDL để tạo proxy phía máy khách.

My other answer on SO nói về một nhu cầu tương tự, điều đó sẽ giúp ít nhất với yêu cầu của Moiz ...

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