JAVA довольно печатный XML с правильно отформатированными комментариями - PullRequest
0 голосов
/ 09 октября 2018

У меня проблема при попытке красиво напечатать xml с правильно отформатированными комментариями.Я генерирую XML-файл из процесса, и мне нужно добавить информацию заголовка в XML-документ.Эта информация заголовка имеет формат XML-комментариев.

Сгенерированный файл выглядит примерно так:

<Messages><Message Name="Foo">FooMessage</Message><Message Name="Bar">BarMessage</Message></Messages>

Сгенерированный файл из другого процесса, в котором я не могу изменить то, чтоэто выводит.После того, как файл xml сгенерирован, мне нужно добавить пару комментариев над данными.Вывод должен выглядеть примерно так, когда я закончу:

<xml version="1.0" encoding="us-ascii">
<!-- Message Documentation -->
<!-- Version 1.0 -->
<Messages>
  <Message Name="Foo">FooMessage</Message>
  <Message Name="Bar">BarMessage</Message>
</Messages>

Но после того, как я пропущу его через свой преобразователь, чтобы хорошенько напечатать xml, комментарии будут сжаты в одну строку:

<xml version="1.0" encoding="us-ascii">
<!-- Message Documentation --><!-- Version 1.0 -->
<Messages>
  <Message Name="Foo">FooMessage</Message>
  <Message Name="Bar">BarMessage</Message>
</Messages>

Заголовок - это просто файл с комментариями:

<!-- Message Documentation -->
<!-- Version 1.0 -->

Это то, чем я сейчас занимаюсь (примечание messages.xml - это сгенерированный файл):

public static void generate() throws Exception {
    List <String> header = Files.readAllLines(Paths.get("header.xml"));
    List <String> message = Files.readAllLines(Paths.get("messasges.xml"));

    StringBuilder sb = new StringBuilder();
    for (String s: header) {
        sb.append(String.format("%s%n", s));
    }
    for (String s: message) {
        sb.append(String.format("%s%n", s));
    }

    Files.write(Paths.get("tmp.xml"), sb.toString.getBytes(), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);

    DocumentBuilder db = DocumentBuilderFactor.newInstance().newDocumentBuilder();

    Document doc = db.parse(Paths.get("tmp.xml").toFile());
    String xmlStr = prettyPrint(doc);
}

public static String prettyPrint(Document doc) throws Exception {
    Transformer transformer = TransformerFactory.newInstance().newTransformer();
    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", 4);
    transformer.setOutputProperty(OutputKeys.ENCODING, "us-ascii");
    transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
    transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, "yes");

    DOMSource source = new DOMSource(doc);
    StringWriter writer = new StringWriter();
    StreamResult result = new StreamResult(writer);
    transformer.transform(source, result);
    return writer.getBuffer().toString();
}

Любая помощь будет принята с благодарностью, поскольку я не смог найти никакой информации о сохранении комментариев в соответствующих строках.

Ответы [ 2 ]

0 голосов
/ 09 августа 2019

В Underscore-java есть метод U.formatXml (строка).Я поддерживаю проект.

0 голосов
/ 10 октября 2018

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

    return writer.getBuffer().toString().replaceAll("--><", "-->\n<");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...