Как правильно сделать отступ XML с помощью XMLSerializer?

Мне трудно сделать отступ в файлах XML, используя XMLSerializer.

я пытался

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

Я пытался добавить \n к FileWriter, но вывод - это \n и \t в начале файла, а не в нужном месте. Я пробовал setPropery с правильным URI и т. д.

Часть кода:

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');

Что мне не хватает?


person Community    schedule 03.09.2010    source источник


Ответы (4)


Вы пытались использовать эти два свойства «в комбинации» в 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");
person naikus    schedule 03.09.2010
comment
Да. Я сделал это, и это дало мне эту ошибку: java.lang.RuntimeException: Unsupported Property: at org.kxml2.io.KXmlSerializer.setProperty(KXmlSerializer.java:260).... - person ; 03.09.2010
comment
@ Эдуардо Бертон: это неправильный ответ, он не работает - person shridutt kothari; 09.06.2016
comment
Я хочу удалить это, так как это не работает для многих людей. Может ли автор вопроса не принимать ответ? - person naikus; 09.06.2016

serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); теперь работает.

Я не знаю, помещал ли я его перед serializer.startDocument(encoding, standalone) или произошла ошибка с вещами, не связанными с созданием .xml!

Спасибо, парни!

person Community    schedule 03.09.2010
comment
как сделать отступ в комментариях? - person accuya; 15.06.2013

Это решение на Java, andriod поддерживает трансформатор, так что это должно работать.

// 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
}
person JonWillis    schedule 03.09.2010
comment
:) У меня сегодня просто хороший гугл фу. Сериализатор XML предназначен для сериализации данных в XML, а средство записи файлов выполняет запись в файл. Таким образом, ответственность за форматирование во что-то удобочитаемое лежит на другом классе, если он уже существует :) - person JonWillis; 03.09.2010
comment
Я пробовал это, но я продолжаю получать файлы без отступов :( Однако ошибок нет. - person Peterdk; 09.04.2013
comment
Если я могу что-то добавить сюда, обязательно replaceAll("[\\s]+", "") в случае строк. В моем случае в строке xml уже было \n, и отступа не было. - person Andrea Richiardi; 21.04.2015

Я просто хотел отметить, что Transformer.setOutputProperties(Properties), похоже, не работает для меня (1.6.0_26_b03), но Transformer.setOutputProperty(String,String) работает отлично.
Если у вас есть объект Properties, вам, возможно, придется выполнить итерацию и индивидуально установить выходное свойство для это работать.

person Andrew Taylor    schedule 27.01.2012