2009-05-21 29 views
5

Tôi đã phát triển một dịch vụ web và triển khai nó với Axis. Tất cả đang chạy rất tốt nhưng tôi đã có một vấn đề khi tôi sử dụng dịch vụ bằng cách sử dụng một chuỗi có chứa một ký tự không thể in (chẳng hạn như ETX, FS, ..). Tôi có lỗi sau:các ký tự XML bất hợp pháp/Axis

exception: java.lang.IllegalArgumentException: The char '0x1c' after '....' is not a valid XML character. 

Bạn có ý tưởng nào không?

chỉnh sửa:

Tôi phải gửi khung đến máy chủ của tôi bằng dịch vụ web. khung của tôi có một hình thức nghiêm ngặt (có chứa một số nhân vật không thể in được như tách)

class Automate {void checkFrame(String frame){// checking the frame}} 

wsdl tập tin

<?xml version="1.0" encoding="UTF-8"?> 

<wsdl:part element="impl:checkFrameResponse" name="parameters"/> 

<wsdl:part element="impl:checkFrame" name="parameters"/> 

<wsdl:operation name="checkFrame"> 

    <wsdl:input message="impl:checkFrameRequest" name="checkFrameRequest"/> 

    <wsdl:output message="impl:checkFrameResponse" name="checkFrameResponse"/> 

    </wsdl:operation> 

<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> 

    <wsdl:operation name="checkFrame"> 

    <wsdlsoap:operation soapAction=""/> 

    <wsdl:input name="checkFrameRequest"> 

     <wsdlsoap:body use="literal"/> 

    </wsdl:input> 

    <wsdl:output name="checkFrameResponse"> 

     <wsdlsoap:body use="literal"/> 

    </wsdl:output> 

    </wsdl:operation> 

<wsdl:port binding="impl:AutomateSoapBinding" name="Automate"> 

    <wsdlsoap:address location="http://localhost:8080/Gateway/services/Automate"/> 

    </wsdl:port> 

Trả lời

3

Đây là vấn đề tự nhiên với SOAP, không may - nó sử dụng XML fo r văn bản, và những nhân vật không thể được đại diện trong XML (ngay cả với các thực thể).

Bạn có thể thoát khỏi các ký tự không thể in bằng cách nào đó không? Bạn sẽ cần phải tìm một số cách không đại diện cho họ như là văn bản thẳng, thật không may.

+0

Tôi không thể thoát khỏi các ký tự đó mà tôi cần chúng để xử lý thêm. để tôi có thể tiến hành như thế nào? –

+0

Bạn sẽ * có * để thoát chúng bằng cách nào đó. Nhưng nếu bạn thoát chúng ở phía gọi bạn có thể unescape chúng ở phía bên nhận và do đó vẫn sử dụng dữ liệu. Tôi đã không gợi ý * bỏ * các nhân vật 'xấu'. –

+0

Để rõ ràng hơn. Tôi đang phát triển một cổng sẽ nhận được một khung hình từ một thiết bị đầu cuối có hình thức nghiêm ngặt để tôi không thể chạm vào nó. Dịch vụ web của tôi phải có khả năng nhận nó cũng như chuyển tiếp lại máy chủ !! Tôi hiện đang tạo một dịch vụ web của khách hàng chỉ để thử nghiệm trên máy chủ cục bộ !! –

0

Có vẻ như bạn có văn bản không thể được trình bày bằng XML. Bạn sẽ phải thoát khỏi những nhân vật này, nhưng phải trung thực tôi nghi ngờ bạn nên "thoát" toàn bộ chuỗi. Mã hóa Base64 chuỗi có thể hoạt động, nhưng bạn cũng có thể xem xét MTOM hoặc một số cơ chế truyền dữ liệu nhị phân khác trên các dịch vụ web.

Nếu bạn sở hữu cả hai mặt của hệ thống này (máy khách và dịch vụ web) thì không quá khó để thêm các bước mã hóa/giải mã và mã hóa base64 là đủ.

+0

thật không may !! Tôi chỉ đang phát triển dịch vụ web !! Và thông thường tôi sẽ nhận được một chuỗi từ thiết bị đầu cuối !!! –

+0

Vì vậy, bạn đang xác định hợp đồng và ngữ nghĩa nhắn tin nếu bạn sở hữu dịch vụ. Điều này cho phép bạn nói "gửi cho tôi XML hợp lệ" hoặc nói "mã hóa văn bản của bạn", phải không? –

+0

Tình huống duy nhất không phải là trường hợp bạn đang triển khai hợp đồng dịch vụ nổi tiếng và khách hàng không thể thay đổi. –

1

Khi bạn tạo XML bạn sẽ chèn bên trong phong bì XML SOAP, bạn cần đảm bảo bạn không có bất kỳ ký tự không thoát nào trong giá trị thuộc tính và trong bất kỳ nút văn bản nào bạn có trong phần tử của mình. Đó là:

<your_elt your_attr="Don&apos;t put unescaped chars here, eg, apostrophe"> 
    <foo> 
     Be sure to escape stuff here too, like: 2 &lt; 100 
     A greek lambda is escaped like this: &#955; 
    </foo> 
</your_elt> 

Tôi cho rằng bạn đang làm điều này trong Java, vì vậy bạn nên xem xét các thư viện tự động thực hiện việc này. Ví dụ, Apache có StringEscapeUtils.

Các ký tự điều khiển của bạn sẽ cần phải được XML numeric character references loại bỏ. Hy vọng StringEscapeUtils sẽ xử lý điều đó cho bạn.

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

+0

Tôi nghĩ rằng đây là những gì tôi đang tìm kiếm !!! Tôi sẽ dùng thử! Cảm ơn :)) –

1

sử dụng CDATA cho dữ liệu không phải là một phần của cấu trúc xml (tức là nội dung), nếu tôi hiểu chính xác và bạn chỉ định tuyến thư là bạn nên làm gì.

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