2010-09-03 42 views
14

Tôi đang gặp khó khăn khi cố gắng thụt lề các tệp XML bằng cách sử dụng XMLSerializer.Làm cách nào để thụt lề XML đúng cách bằng XMLSerializer?

Tôi đã thử

serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", 
         true); 

Tôi đã cố gắng để nối thêm \n vào FileWriter nhưng sản lượng là \n 's và \t' s vào lúc bắt đầu của tập tin và không ở đúng nơi. Tôi đã thử setPropery với đúng URI, vv

Một phần của mã:

XmlPullParserFactory parserFactory = XmlPullParserFactory.newInstance(); 
parserFactory .setNamespaceAware(true); 
XmlSerializer serializer = parserFactory .newSerializer(); 
File xmlFile = new File(PATH + ".xml");   
FileWriter writer = new FileWriter(xmlFile);    
serializer.setOutput(writer); 
//serializer.setProperty(INDENT_URL, INDENT); 
serializer.startDocument("UTF-8", null); 
//serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", 
         true); 
serializer.startTag(null, "bla"); 
writer.append('\n'); 

tôi thiếu gì?

Trả lời

4

Bạn đã thử sử dụng hai thuộc tính này "kết hợp" trên Serializer?

// indentation as 3 spaces 
serializer.setProperty(
    "http://xmlpull.org/v1/doc/properties.html#serializer-indentation", " "); 
// also set the line separator 
serializer.setProperty(
    "http://xmlpull.org/v1/doc/properties.html#serializer-line-separator", "\n"); 
+8

Có. Tôi đã làm và nó đã cho tôi lỗi này: java.lang.RuntimeException: Thuộc tính không được hỗ trợ: tại org.kxml2.io.KXmlSerializer.setProperty (KXmlSerializer.java:260) .... –

+2

Điều này không hoạt động –

+0

@Eduardo Berton: Đây không phải là câu trả lời chính xác, nó không hoạt động –

3

Đây là một giải pháp trong Java, andriod không hỗ trợ máy biến áp nên việc này sẽ hoạt động.

// import additional packages 
import java.io.*; 

// import DOM related classes 
import org.w3c.dom.*; 
import javax.xml.parsers.*; 
import javax.xml.transform.*; 
import javax.xml.transform.dom.*; 
import javax.xml.transform.stream.*; 

// write the output file 
try { 
    // create a transformer 
    TransformerFactory transFactory = TransformerFactory.newInstance(); 
    Transformer  transformer = transFactory.newTransformer(); 

    // set some options on the transformer 
    transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8"); 
    transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); 
    transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
    transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); 

    // get a transformer and supporting classes 
    StringWriter writer = new StringWriter(); 
    StreamResult result = new StreamResult(writer); 
    DOMSource source = new DOMSource(xmlDoc); 

    // transform the xml document into a string 
    transformer.transform(source, result); 

    // open the output file 
    FileWriter outputWriter = new FileWriter(outputFile); 
    outputWriter.write(writer.toString()); 
    outputWriter.close(); 

} catch(javax.xml.transform.TransformerException e) { 
    // do something with this error 
}catch (java.io.IOException ex) { 
    // do something with this error 
} 
+0

:) Tôi chỉ có google foo tốt hôm nay. Trình tuần tự hóa XML là nối tiếp dữ liệu với XML và người viết tệp ghi vào một tệp. Vì vậy, trách nhiệm để định dạng cho một cái gì đó con người có thể đọc được nằm trong lớp khác nếu nó đã tồn tại :) – JonWillis

+2

Tôi đã cố gắng này, nhưng tôi tiếp tục nhận được các tập tin không thụt lề: (Không có lỗi mặc dù – Peterdk

+1

Nếu tôi có thể thêm một cái gì đó ở đây, hãy chắc chắn để ' '' replaceAll ("[\\ s] +", "") '' 'trong trường hợp chuỗi. Trong trường hợp của tôi chuỗi xml đã có' '' \ n''' và thụt lề không xảy ra. –

35

serializer.setFeature(" http://xmlpull.org/v1/doc/features.html#indent-output ", true); hiện đang hoạt động.

Tôi không biết nếu tôi đã đặt nó trước serializer.startDocument(encoding, standalone) hoặc đã xảy ra lỗi với nội dung không liên quan đến việc tạo .xml!

Xin cảm ơn các bạn!

+0

làm cách nào để thụt lề nhận xét? – accuya

1

Tôi chỉ muốn ghi chú rằng Transformer.setOutputProperties(Properties) dường như không hoạt động đối với tôi (1.6.0_26_b03), nhưng Transformer.setOutputProperty(String,String) hoàn hảo.
Nếu bạn có đối tượng Thuộc tính, bạn có thể phải lặp và thiết lập riêng thuộc tính đầu ra cho nó hoạt động.

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