Java: как сделать отступ в XML, сгенерированном Transformer

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

пример кода

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>

Мысли?

104 голоса | спросил Mike 6 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 06 Sep 2009 07:29:56 +0400 2009, 07:29:56

7 ответов


0

Вам нужно включить «INDENT» и установить величину отступа для трансформатора:

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

Update:


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

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

ответил adatapost 6 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 06 Sep 2009 07:44:40 +0400 2009, 07:44:40
0

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

  1. установить номер отступа в трансформаторную фабрику
  2. включить отступ в преобразователе
  3. оберните поток ответов писателем (или буферизованным писателем)
 //(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

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

ответил mabac 14 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 14 Sep 2011 11:51:17 +0400 2011, 11:51:17
0

Следующий код работает для меня с Java 7. Я установил отступ (yes) и indent-amount (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 оказался полезным.

ответил remipod 9 Jpm1000000pmMon, 09 Jan 2012 14:14:57 +040012 2012, 14:14:57
0

import com.sun.org.apache.xml.internal.serializer.OutputPropertiesFactory

transformer.setOutputProperty(OutputPropertiesFactory.S_KEY_INDENT_AMOUNT, "2");
ответил 6 42014vEurope/Moscow11bEurope/MoscowThu, 06 Nov 2014 17:41:59 +0300 2014, 17:41:59
0

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

TransformerFactory tf = TransformerFactory.newInstance();
tf.setAttribute("indent-number", new Integer(2));
Transformer t = tf.newTransformer();
ответил lucbelanger 5 SatEurope/Moscow2009-12-05T00:39:00+03:00Europe/Moscow12bEurope/MoscowSat, 05 Dec 2009 00:39:00 +0300 2009, 00:39:00
0

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

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);
ответил sevensevens 6 Maypm13 2013, 22:46:38
0

Для меня добавление DOCTYPE_PUBLIC сработало:

transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC,"yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "10");
ответил Vikas Chowdhury 12 PM00000020000000731 2016, 14:58:07

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132