У меня есть строка Java, которая содержит XML, без перевода строки или отступов. Я хотел бы превратить его в строку с красиво отформатированным XML. Как мне это сделать?
String unformattedXml = "<tag><nested>hello</nested></tag>";
String formattedXml = new [UnknownClass]().format(unformattedXml);
Примечание: мой ввод - строка . Мой вывод - строка .
(Основной) макет результата:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<tag>
<nested>hello</nested>
</tag>
</root>
java
xml
pretty-print
Стив Маклеод
источник
источник
Ответы:
Примечание. Результаты могут отличаться в зависимости от версии Java. Ищите обходные пути, специфичные для вашей платформы.
источник
<?xml version="1.0" encoding="UTF-8"?>
?<?xml ...>
объявление, добавьтеtransformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes")
doc
определяется?Вот ответ на мой собственный вопрос. Я объединил ответы из различных результатов, чтобы написать класс, который прекрасно печатает XML.
Нет гарантий того, как он отвечает с недействительным XML или большими документами.
источник
writer.getDomConfig().setParameter("format-pretty-print", Boolean.TRUE);
послеLSSerializer writer = ...
строки.document
инициализации переменной , поэтому я подумал, что могу добавить замедление и сделать из него быстрый пример. Дайте мне знать, если я должен что-то изменить, pastebin.com/XL7932aCболее простое решение, основанное на этом ответе :
прецедент:
возвращает:
источник
factory.setAttribute("indent-number", 4);
и теперь она работает.<?xml version="1.0" encoding="UTF-8"?>
?transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
<?xml version="1.0" encoding="UTF-8"?><root>
все в одной строке. Есть идеи почему?transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, "yes");
сработало для меня.Сейчас 2012 год, и Java может сделать больше, чем раньше, с XML, я хотел бы добавить альтернативу моему принятому ответу. Это не имеет никаких зависимостей вне Java 6.
источник
Просто чтобы отметить, что для ответа с самым высоким рейтингом требуется использование ксероксов.
Если вы не хотите добавлять эту внешнюю зависимость, тогда вы можете просто использовать стандартные библиотеки jdk (которые на самом деле создаются с использованием xerces для внутреннего использования).
NB Существовал ошибка с JDK версии 1.5 см http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6296446 но решается в настоящее время.,
(Обратите внимание, что в случае ошибки возвращается исходный текст)
источник
Я довольно печататься в прошлом , используя org.dom4j.io.OutputFormat.createPrettyPrint () метод
источник
prettyPrintedString.replaceAll("\\s+\n", "\n")
Вот способ сделать это с помощью dom4j :
Импорт:
Код:
источник
<?xml version...
в одной строке, а все остальное в другой строке.Так как вы начинаете с a
String
, вам нужно перейти кDOM
объекту (напримерNode
), прежде чем вы сможете использоватьTransformer
. Тем не менее, если вы знаете, что ваша XML-строка является допустимой, и вы не хотите нести нагрузку на память при разборе строки в DOM, а затем выполнить преобразование через DOM, чтобы получить строку обратно - вы можете просто сделать несколько старомодным посимвольный разбор. Вставьте новую строку и пробелы после каждого</...>
символа, сохраняйте и вставляйте счетчик (для определения количества пробелов), который вы увеличиваете для каждого<...>
и уменьшаете для каждого, который</...>
вы видите.Отказ от ответственности - я выполнил вырезку / вставку / редактирование текста нижеприведенных функций, поэтому они могут не скомпилироваться как есть.
источник
Если вы можете использовать стороннюю XML-библиотеку, вы можете получить что-то значительно более простое, чем то, что предлагают ответы с наибольшим количеством голосов .
Было указано, что и вход, и выход должны быть строками, поэтому вот вспомогательный метод, который делает именно это, реализованный с помощью библиотеки XOM :
Я проверил, что это работает, и результаты не зависят от вашей версии JRE или чего-то подобного. Чтобы увидеть, как настроить выходной формат по своему вкусу, взгляните на
Serializer
API.Это на самом деле получилось дольше, чем я думал - нужны были дополнительные строки, потому
Serializer
чтоOutputStream
писать. Но обратите внимание, что здесь очень мало кода для реального твилинга XML.(Этот ответ является частью моей оценки XOM, которая была предложена в качестве одного из вариантов в моем вопросе о лучшей библиотеке Java XML для замены dom4j. Для записи, с помощью dom4j вы можете достичь этого с такой же легкостью, используя
XMLWriter
иOutputFormat
. Редактировать : .. .as продемонстрировано в ответе mlo55 .)источник
Кевин Хакансон сказал: «Однако, если вы знаете, что ваша XML-строка верна, и вы не хотите нести нагрузку на память при разборе строки в DOM, а затем запустите преобразование через DOM, чтобы вернуть строку - вы можете просто сделайте какой-нибудь старомодный анализ символов. Вставьте новую строку и пробелы после каждого символа, сохраняйте и вставляйте счетчик (для определения количества пробелов), который вы увеличиваете для каждого <...> и уменьшаете для каждого, который видите. "
Согласовано. Такой подход намного быстрее и имеет гораздо меньше зависимостей.
Пример решения:
источник
Хм ... сталкивался с чем-то вроде этого, и это известная ошибка ... просто добавьте этот OutputProperty ..
Надеюсь это поможет ...
источник
Относительно комментария, что «сначала вы должны построить дерево DOM»: Нет, вам не нужно и не следует этого делать.
Вместо этого создайте StreamSource (новый StreamSource (новый StringReader (str))) и передайте его упомянутому преобразователю идентичности. Он будет использовать SAX-анализатор, и результат будет намного быстрее. Создание промежуточного дерева в этом случае является чисто накладными расходами. В противном случае самый лучший ответ - это хорошо.
источник
Использование scala:
Вы можете сделать это и в Java, если вы зависите от scala-library.jar. Это выглядит так:
PrettyPrinter
Объект построен с два Интсом, первыми из которых максимальной длиной линии , а вторые этап вдавливания.источник
немного улучшенная версия от milosmns ...
источник
} else if (row.startsWith("</")) {
часть на это:else if (row.startsWith("</")) { String indent = repeatIdent(--stack); if (pretty.charAt(pretty.length() - 1) == '\n') { pretty.append(indent + row + "\n"); } else { pretty.append(row + "\n"); } }
Просто для дальнейшего использования, вот решение, которое сработало для меня (благодаря комментарию, который @George Hawkins разместил в одном из ответов):
источник
Если вы уверены, что у вас есть действительный XML-файл, он прост и позволяет избежать использования DOM-деревьев XML. Может быть, есть ошибки, прокомментируйте, если вы видите что-нибудь
источник
Все вышеперечисленные решения не работают для меня, тогда я нашел это http://myshittycode.com/2014/02/10/java-properly-indenting-xml-string/
Подсказка - удалить пробелы с XPath
источник
Этот код ниже работает отлично
источник
Я смешиваю их все и пишу одну небольшую программу. Это чтение из файла XML и распечатка. Просто вместо xzy укажите свой путь к файлу.
источник
Просто еще одно решение, которое работает для нас
источник
Использование jdom2: http://www.jdom.org/
источник
В качестве альтернативы ответам от max , Codekraps , David Easley и milosmns , взгляните на мою легкую, высокопроизводительную библиотеку pretty-printer: xml-formatter
Иногда, например, при запуске поддельных сервисов SOAP непосредственно из файла, хорошо иметь симпатичный принтер, который также обрабатывает уже симпатичный печатный XML:
Как прокомментировали некоторые, приятная печать - это просто способ представления XML в более понятной для человека форме - пробельные символы строго не принадлежат вашим XML-данным.
Библиотека предназначена для симпатичной печати в целях ведения журналов, а также включает функции фильтрации (удаление / анонимизация поддеревьев) и симпатичной печати XML в узлах CDATA и Text.
источник
У меня была такая же проблема, и я добился большого успеха с JTidy ( http://jtidy.sourceforge.net/index.html )
Пример:
источник
У Underscore-Java есть статический метод
U.formatXml(string)
. Я поддерживаю проект. Живой примерВывод:
источник
есть очень хорошая утилита командной строки xml под названием xmlstarlet ( http://xmlstar.sourceforge.net/ ), которая может делать много вещей, которые используют многие люди.
Вы можете выполнить эту программу программно, используя Runtime.exec, а затем прочитать отформатированный выходной файл. Он имеет больше опций и лучшую отчетность об ошибках, чем несколько строк кода Java.
скачать xmlstarlet: http://sourceforge.net/project/showfiles.php?group_id=66612&package_id=64589
источник
Я обнаружил, что в Java 1.6.0_32 нормальный метод для симпатичной печати строки XML (с использованием Transformer с нулевым значением или идентификатором xslt) ведет себя не так, как хотелось бы, если бы теги были просто разделены пробелами, в отличие от отсутствия разделения текст. Я пытался использовать
<xsl:strip-space elements="*"/>
в моем шаблоне безрезультатно. Самым простым решением, которое я нашел, было освободить пространство так, как я хотел, используя SAXSource и XML-фильтр. Так как мое решение было для регистрации, я также расширил это для работы с неполными фрагментами XML. Обратите внимание, что обычный метод работает нормально, если вы используете DOMSource, но я не хотел использовать его из-за неполноты и нехватки памяти.источник
Решения, которые я нашел здесь для Java 1.6+, не переформатируют код, если он уже отформатирован. Тот, который работал для меня (и переформатировал уже отформатированный код), был следующим.
Это хороший инструмент для использования в ваших модульных тестах для сравнения полностроковых XML.
источник
Для тех, кто ищет быстрое и грязное решение, для которого не требуется, чтобы XML был действительным на 100%. например, в случае регистрации REST / SOAP (вы никогда не знаете, что посылают другие ;-))
Я нашел и усовершенствовал отсканированный код, который я нашел в Интернете, и который, как мне кажется, до сих пор здесь не существует в качестве допустимого подхода:
вот вывод:
источник
Я видел один ответ с помощью
Scala
, так что вот еще одинGroovy
, на случай, если кто-то найдет его интересным. Отступ по умолчанию - 2 шага,XmlNodePrinter
конструктору может быть передано и другое значение.Использование из Java, если groovy jar находится в classpath
источник
В случае, если вам не нужно много отступов, а только несколько разрывов строк, может быть достаточно просто регулярное выражение ...
Код хороший, а не результат из-за отсутствия отступов.
(Решения с отступом см. В других ответах.)
источник