2008-10-01 34 views
8

Trong môi trường của tôi ở đây tôi sử dụng Java để tuần tự hóa tập hợp kết quả thành XML. Nó xảy ra cơ bản như thế này:Làm cách nào để mã hóa các ký tự từ Oracle sang XML?

//foreach column of each row 
xmlHandler.startElement(uri, lname, "column", attributes); 
String chars = rs.getString(i); 
xmlHandler.characters(chars.toCharArray(), 0, chars.length()); 
xmlHandler.endElement(uri, lname, "column"); 

XML trông như thế này trong Firefox:

<row num="69004"> 
    <column num="1">10069</column> 
    <column num="2">sd&#26;</column> 
    <column num="3">FCVolume      </column> 
</row> 

Nhưng khi tôi phân tích cú pháp XML tôi nhận được một org.xml.sax

.SAXParseException: Tham chiếu ký tự "& # 26" là một ký tự XML không hợp lệ .

Câu hỏi của tôi bây giờ là: Tôi phải thay thế charact nào hoặc làm cách nào để mã hóa các ký tự của mình, chúng sẽ là XML hợp lệ?

Trả lời

7

Tôi tìm thấy một danh sách thú vị trong Xml Spec: Theo Danh sách mà mình nản lòng sử dụng nhân vật # 26 (Hex: # x1A).

Các ký tự được xác định trong phạm vi sau cũng không được khuyến khích. Họ là một trong hai ký tự điều khiển hoặc vĩnh viễn không xác định Unicode ký tự

Xem complete ranges.

Mã này thay thế tất cả Xml UTF8 không hợp lệ từ một String:

public String stripNonValidXMLCharacters(String in) { 
    StringBuffer out = new StringBuffer(); // Used to hold the output. 
    char current; // Used to reference the current character. 

    if (in == null || ("".equals(in))) return ""; // vacancy test. 
    for (int i = 0; i < in.length(); i++) { 
     current = in.charAt(i); 
     if ((current == 0x9) || 
      (current == 0xA) || 
      (current == 0xD) || 
      ((current >= 0x20) && (current <= 0xD7FF)) || 
      ((current >= 0xE000) && (current <= 0xFFFD)) || 
      ((current >= 0x10000) && (current <= 0x10FFFF))) 
      out.append(current); 
    } 
    return out.toString(); 
}  

của nó lấy từ Invalid XML Characters: when valid UTF8 does not mean valid XML

Nhưng với điều đó tôi đã có vấn đề UTF-8 compatility vẫn:

org.xml.sax.SAXParseException: Invalid byte 1 of 1-byte UTF-8 sequence 

Sau khi đọc XML - returning XML as UTF-8 from a servlet Tôi vừa thử điều gì xảy ra nếu tôi đặt kiểu nội dung như sau:

response.setContentType("text/xml;charset=utf-8"); 

Và nó đã hoạt động ....

2

Extensible Markup Language (XML) 1.0 nói:

Nhân vật dấu và (&) và khung góc trái (<) không phải xuất hiện ở dạng đen của họ, trừ khi sử dụng như delimiters đánh dấu, hoặc trong một bình luận , hướng dẫn xử lý hoặc phần CDATA. Nếu cần ở nơi khác, chúng phải được thoát bằng cách sử dụng các tham chiếu ký tự số hoặc số hoặc các chuỗi "&" và "<" tương ứng. Góc bên phải khung (>) có thể được biểu diễn bằng cách sử dụng chuỗi ">", và phải, cho tính tương thích, được thoát bằng cách sử dụng ">" hoặc một tham chiếu nhân vật khi nó xuất hiện trong chuỗi "]]>" trong nội dung , khi chuỗi đó không phải là đánh dấu phần cuối của phần CDATA.

Bạn có thể bỏ qua mã hóa nếu bạn sử dụng CDATA:

<column num="1"><![CDATA[10069]]></column> 
<column num="2"><![CDATA[sd&]]></column> 
+0

Đó sẽ là giải pháp tốt, nhưng tôi không biết cách tạo phần CDATA (tôi chỉ có thể làm việc với trình xử lý sax xml và không có quyền truy cập vào luồng). Và nếu tôi đặt CDATA trong các ký tự, ký tự <'s được mã hóa thành> .... –

0

Bạn đang chạy phiên bản JRE nào? Sax Project nói:

J2SE 1.4 gói phiên bản cũ SAX2. Làm cách nào để tạo SAX2 r2 trở lên?

+0

J2SE 1.5. Dù sao, cảm ơn gợi ý –

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