Java: как отступить XML, сгенерированный трансформатором


Я использую встроенный в XML-трансформатор Java, чтобы взять документ DOM и распечатать полученный XML. Проблема в том, что он вообще не отступает от текста, несмотря на то, что явно установил параметр "отступ".

пример кода

public class TestXML {

 public static void main(String args[]) throws Exception {
  ByteArrayOutputStream s;

  Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
  Transformer t = TransformerFactory.newInstance().newTransformer();

  Element a,b;

  a = d.createElement("a");
  b = d.createElement("b");

  a.appendChild(b);

  d.appendChild(a);

  t.setParameter(OutputKeys.INDENT, "yes");

  s = new ByteArrayOutputStream();

  t.transform(new DOMSource(d),new StreamResult(s));

  System.out.println(new String(s.toByteArray()));

 }
}

результат

<?xml version="1.0" encoding="UTF-8" standalone="no"?><a><b/></a>

желаемого результата

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<a>
 <b/>
</a>

мысли?

7 101

7 ответов:

необходимо включить 'отступ' и установить величину отступа для трансформатора:

t.setOutputProperty(OutputKeys.INDENT, "yes");
t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");

обновление:


ссылки : Как удалить только пробелы текстовые узлы из DOM перед сериализацией?

(большое спасибо всем участникам, особенно @marc-novakowski, @james-murty и @saad):

ни одно из предложенных решений работал для меня. Поэтому я продолжал искать альтернативное решение, которое в конечном итоге оказалось смесью двух вышеупомянутых и третьего шага.

  1. установите номер отступа в transformerfactory
  2. включить отступ в трансформаторе
  3. оберните otuputstream с помощью writer (или bufferedwriter)
//(1)
TransformerFactory tf = TransformerFactory.newInstance();
tf.setAttribute("indent-number", new Integer(2));

//(2)
Transformer t = tf.newTransformer();
t.setOutputProperty(OutputKeys.INDENT, "yes");

//(3)
t.transform(new DOMSource(doc),
new StreamResult(new OutputStreamWriter(out, "utf-8"));

вы должны сделать (3), чтобы обойти" багги " поведение обработка xml код.

источник: johnnymac75 @ http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6296446

(Если я неправильно процитировал свой источник, пожалуйста, дайте мне знать)

следующий код работает для меня с Java 7. Я установил отступ (да) и отступ-количество (2) на трансформаторе (а не на трансформаторной фабрике), чтобы заставить его работать.

TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
t.setOutputProperty(OutputKeys.INDENT, "yes");
t.transform(source, result);

решение@mabac для установки атрибута не сработало для меня, но комментарий @lapo оказался полезным.

импортировать com.солнце.орг."Апач".в формате XML.внутренние.сериализатор.OutputPropertiesFactory

transformer.setOutputProperty(OutputPropertiesFactory.S_KEY_INDENT_AMOUNT, "2");

Если вы хотите отступ, вы должны указать его в TransformerFactory.

TransformerFactory tf = TransformerFactory.newInstance();
tf.setAttribute("indent-number", new Integer(2));
Transformer t = tf.newTransformer();

я использовал библиотеку Xerces (Apache) вместо того, чтобы возиться с трансформатором. После добавления библиотеки добавьте код ниже.

OutputFormat format = new OutputFormat(document);
format.setLineWidth(65);
format.setIndenting(true);
format.setIndent(2);
Writer outxml = new FileWriter(new File("out.xml"));
XMLSerializer serializer = new XMLSerializer(outxml, format);
serializer.serialize(document);

для меня DOCTYPE_PUBLIC работает:

transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC,"yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "10");