2010-12-14 31 views
8

Tôi cần phải tuần tự hóa một đối tượng java XML vào một tệp XML bằng cách sử dụng JAXB Marshaller (JAXB phiên bản 2.2). Bây giờ trong đối tượng xml, tôi có một thẻ chứa String value ví dụ rằng:Xử lý các ký tự thoát XML (ví dụ: dấu ngoặc kép) bằng cách sử dụng JAXB Marshaller

"<"tagA> 
**"<"YYYYY>done"<"/YYYYY>** 
"<"/tagA> 

Bây giờ khi bạn có thể thấy rằng giá trị chuỗi này một lần nữa có chứa các thẻ. Tôi muốn điều này được viết theo cách tương tự trong tệp xml.

Nhưng JAXB marshaller chuyển đổi các giá trị như:

"&"lt;YYYYY"&"gt;"&"#xD;done ... & vân vân

tôi không thể để điều trị những nhân vật này thoát riêng biệt sử dụng JAXB 2.2 Có thể anyways?

Bất kỳ sự giúp đỡ trong vấn đề này sẽ là tuyệt vời ..

Cảm ơn trước, Abhinav Mishra

Trả lời

7

Xong nó bằng cách thiết lập thuộc tính sau cho JAXB marshaller:

marshaller.setProperty("jaxb.encoding", "Unicode"); 
+0

bạn có thể vui lòng giải thích về cách sử dụng của bạn để thoát khỏi charatcer. Tôi không thể làm điều đó với jus các tài sản thiết lập để unicode. –

+0

Để xây dựng tương tự, tôi vừa đặt thuộc tính sau cho trình soạn thảo: marshaller.setProperty ("jaxb.encoding", "Unicode"); marshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.setProperty (CharacterEscapeHandler.class.getName(), new CustomCharacterEscapeHandler()); – javdev

+0

Ở đây trong câu lệnh thứ ba như bạn có thể thấy tôi đã tạo ra một lớp CustomCharacterEscapeHandler mà thực sự đang thực hiện xử lý ký tự thoát. Bạn có thể tìm mã của nó dễ dàng trên mạng bằng cách tìm kiếm 'cách ghi đè phương thức thoát của CharacterEscapeHandler'. Trong trường hợp bạn cần mã, hãy hỏi tôi .. – javdev

2

Bạn có thể tận dụng các cấu trúc CDATA. JAXB chuẩn không bao gồm cấu trúc này. Có một phần mở rộng trong EclipseLink JAXB (MOXy) cho điều này (tôi là người lãnh đạo công nghệ cao). Kiểm tra câu trả lời của tôi cho một câu hỏi liên quan:

Nó mô tả các chú thích @XmlCDATA trong MOXY:

import javax.xml.bind.annotation.XmlRootElement; 
import org.eclipse.persistence.oxm.annotations.XmlCDATA; 

@XmlRootElement(name="c") 
public class Customer { 

    private String bio; 

    @XmlCDATA 
    public void setBio(String bio) { 
     this.bio = bio; 
    } 

    public String getBio() { 
     return bio; 
    } 

} 

Để biết thêm thông tin xem:

+0

Cảm ơn câu trả lời của bạn Blaise. Tôi sẽ khám phá điều này một cách chắc chắn vì nó có vẻ thú vị. Tuy nhiên, tôi đã tìm thấy một giải pháp cho vấn đề của tôi mà tôi đang gửi bên dưới .. – javdev

1

Tùy thuộc vào những gì bạn đang chính xác tìm kiếm bạn có thể:

  • disable nhân vật thoát
  • hoặc sử dụng CDATA chuỗi có hỗ trợ có thể được thêm vào JAXB chỉ với một chút cấu hình
6

Có một cách đơn giản hơn.Đầu tiên chuỗi sử dụng tùy chỉnh thoát:

m.setProperty(CharacterEscapeHandler.class.getName(), new CharacterEscapeHandler() { 
    @Override 
    public void escape(char[] ch, int start, int length, boolean isAttVal, Writer out) throws IOException { 
     out.write(ch, start, length); 
    } 
}); 

Sau đó marshal nó vào một String như đề cập dưới đây

StringWriter writer = new StringWriter(); 
m.marshal(marshalObject, writer); 

và sau đó tạo ra một đối tượng tài liệu từ các nhà văn đề cập dưới đây vấn đề

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
InputSource is = new InputSource(new StringReader(writer.toString())); 
Document doc = builder.parse(is); 

ký tự thoát sẽ được giải quyết

+3

vấn đề của phương pháp này là bạn không thể xây dựng ứng dụng với OpenJDK. com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler thuộc về Sun JDK. – walv

+0

Bạn có thể sử dụng com.sun.xml.bind.marshaller.CharacterEscapeHandler – user2814648

0

Với JAXB marshaller nếu bạn muốn toàn quyền kiểm soát o ver để thoát khỏi nhân vật (ví dụ: "\ '"), Bạn sẽ phải bổ sung tài sản:

Marshaller marshaller = jc.createMarshaller(); 
marshaller.setProperty(CharacterEscapeHandler.class.getName(), new CustomCharacterEscapeHandler()); 

và tạo ra một lớp CustomCharacterEscapeHandler mới

import com.sun.xml.bind.marshaller.CharacterEscapeHandler; 

import java.io.IOException; 
import java.io.Writer; 

public class CustomCharacterEscapeHandler implements CharacterEscapeHandler { 

    public CustomCharacterEscapeHandler() { 
     super(); 
    } 

    public void escape(char[] ch, int start, int length, boolean isAttVal, Writer out) throws IOException { 
     // avoid calling the Writerwrite method too much by assuming 
     // that the escaping occurs rarely. 
     // profiling revealed that this is faster than the naive code. 
     int limit = start+length; 
     for (int i = start; i < limit; i++) { 
      char c = ch[i]; 
      if(c == '&' || c == '<' || c == '>' || c == '\'' || (c == '\"' && isAttVal)) { 
       if(i!=start) 
        out.write(ch,start,i-start); 
       start = i+1; 
       switch (ch[i]) { 
        case '&': 
         out.write("&amp;"); 
         break; 
        case '<': 
         out.write("&lt;"); 
         break; 
        case '>': 
         out.write("&gt;"); 
         break; 
        case '\"': 
         out.write("&quot;"); 
         break; 
        case '\'': 
         out.write("&apos;"); 
         break; 
       } 
      } 
     } 

     if(start!=limit) 
      out.write(ch,start,limit-start); 
    } 
} 

Hy vọng rằng sẽ giúp.

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