2010-06-09 31 views
7

Tôi đã DOM sauLàm cách nào để dừng XmlSerializer chuyển đổi ê thành & # 234; trong một thuộc tính?

<row> 
     <link href="B&#252;ro.txt" target="_blank"> 
      my link 
     </link> 
    </row> 

Khi tôi serialize nó vào một tập tin bằng cách sử dụng Java XmlSerializer nói ra như thế này:

<row> 
     <link href="B&amp;#252;ro.txt" target="_blank"> 
      my link 
     </link> 
    </row> 

Có cách nào để kiểm soát cách XmlSerializer handle thoát trong thuộc tính? Tôi có nên làm điều này theo cách khác không?

Cập nhật

Tôi cũng nên nói rằng tôi đang sử dụng jre 1.6. Tôi đã sử dụng 1,5 jre cho đến thời gian gần đây và tôi khá chắc chắn rằng nó đã được đăng 'đúng' (ví dụ: các '&' đã không thoát)

Làm rõ

DOM được tạo lập trình. Dưới đây là một ví dụ:

 Document doc = createDocument(); 
     Element root = doc.createElement("root"); 
     doc.appendChild(root); 
     root.setAttribute("test1", "&#234;"); 
     root.setAttribute("test2", "üöä"); 
     root.appendChild(doc.createTextNode("&#234;")); 

     StringWriter sw = new StringWriter(); 

     serializeDocument(doc, sw); 
     System.out.println(sw.toString()); 

Giải pháp của tôi Tôi không thực sự muốn làm điều này vì nó liên quan đến một số tiền hợp lý của sự thay đổi mã và thử nghiệm nhưng tôi quyết định chuyển các dữ liệu thuộc tính thành một phần tử CDATA. Sự cố đã giải quyết được tránh.

Trả lời

2

Làm cách nào để bạn có được DOM? Nó có thể liên quan gì đến điều đó không? Tôi đã thử XML mẫu của bạn với DocumentBuilder chuẩn (chỉ cần b/c Tôi quen thuộc hơn với nó) bằng cách sử dụng Sun Java 6 và Xerces-J (2.9.1) mới nhất mà bằng cách không dùng XmlSerializer để ủng hộ LSSerializer hoặc TrAX.

Dù sao, bằng cách sử dụng kỹ thuật này, tài liệu đã được tuần tự hóa thậm chí không chứa tham chiếu ký tự nữa và được chuyển thành "Büro.txt". Tôi đã sử dụng mã sau:

String xml = "<row>\n" 
    + "  <link href=\"B&#252;ro.txt\" target=\"_blank\">\n" 
    + "   my link\n" + "  </link>\n" + " </row>"; 

InputStream is = new ByteArrayInputStream(xml.getBytes()); 
Document doc = DocumentBuilderFactory.newInstance() 
    .newDocumentBuilder().parse(is); 

XMLSerializer xs = new XMLSerializer(); 
xs.setOutputCharStream(new PrintWriter(System.err)); 

xs.serialize(doc); 
+0

Cảm ơn +1. DOM được tạo lập trình (appendChild v.v.). Tôi sẽ thêm một làm rõ cho câu hỏi. Chỉ cần phát hiện ra LSSerializier vì vậy tôi sẽ xem xét điều đó. – paul

+0

Được rồi, xem nào. Có lẽ ai đó biết một giải pháp tốt hơn nhưng tôi nghi ngờ nó là không thể (ít nhất là trong một cách sạch) để tạo ra các tham chiếu ký tự theo cách đó bởi vì dữ liệu được xử lý như vậy chứ không phải hướng dẫn XML. Có thể sai mặc dù ... Vì cả XML và Java là Unicode nhận thức, điều này có thể không quá tệ. – musiKk

4

Vấn đề là bạn đang xây dựng DOM với các giá trị thuộc tính đã được "thoát" theo các quy ước XML. DOM (tất nhiên) không nhận ra rằng bạn đã làm điều này và đang thoát khỏi dấu và.

Bạn nên thay đổi

root.setAttribute("test1", "&#234;"); 

để

root.setAttribute("test1", "\u00EA"); 

Nói cách khác, dây sử dụng bao gồm codepoints Unicode đơn giản khi xây dựng DOM. XMLSerializer sau đó sẽ thay thế các ký tự Unicode với các thực thể ký tự theo yêu cầu ... tùy thuộc vào mã hóa ký tự đã chọn cho tài liệu đầu ra.

EDIT - Lý do bạn vẫn có thể thấy các ký tự thô thay vì các thực thể ký tự trong XML ouput là XMLSerializer đang sử dụng mã hóa mặc định cho XML; tức là UTF-8. Cách để giải quyết vấn đề này là sử dụng hàm tạo XMLSerializer(OutputFormat), chuyển một số OutputFormat chỉ định mã hóa ký tự được yêu cầu cho XML. (Có vẻ như bạn đang sử dụng "ASCII".) Đảm bảo sử dụng mã hóa ký tự tương thích cho số OutputStream.

+0

+1 âm thanh rất hợp lý. Tuy nhiên, tôi đã thử nó và '\ u00EA' vẫn chưa được xử lý. Tôi đang đặt giá trị thuộc tính trong thuộc tính href của thẻ neo, ví dụ: paul

+0

\ u00EA là lối thoát Java unicode. Nếu nó bằng cách nào đó xuất hiện ở đầu ra ở dạng đó ... bạn phải bao gồm nó trong dữ liệu đầu vào chứ không phải là ký tự Java hoặc chuỗi ký tự. –

+1

Sử dụng "ASCII" thay vì "UTF8" làm mã hóa hoạt động tốt. – Etan

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