【问题标题】:JAVA pretty print XML with properly formatted comments带有正确格式注释的 JAVA 漂亮的打印 XML
【发布时间】:2018-10-09 20:50:42
【问题描述】:

我在尝试使用格式正确的 cmets 漂亮地打印 xml 时遇到问题。我从一个进程生成一个 xml 文件,并且需要将标题信息添加到 xml 文档中。这个头信息的格式是xml cmets。

生成的文件如下所示:

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

生成的文件来自不同的进程,我无法修改它的输出。生成 xml 文件后,我需要在数据上方添加几个 cmets。完成后输出应该是这样的:

<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 之后,它会导致 cmets 被压缩成一行:

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

标头只是一个包含 cmets 的文件:

<!-- 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();
}

任何帮助将不胜感激,因为我无法找到任何有关在各自行上保留 cmets 的信息。

【问题讨论】:

  • 你能告诉我标题和消息的内容吗?
  • 我在操作中添加了一个编辑

标签: java xml xml-parsing


【解决方案1】:

恐怕您无法通过设置来实现这一点。 使用一点蛮力:

    return writer.getBuffer().toString().replaceAll("--><", "-->\n<");

【讨论】:

    【解决方案2】:

    Underscore-java 有方法U.formatXml(string)。我是项目的维护者。 Live example

    import com.github.underscore.U;
    
    public class MyClass {
        public static void main(String args[]) {
            System.out.println(U.formatXml("<?xml version=\"1.0\" encoding=\"us-ascii\"?>\n"
              + "<!-- Message Documentation -->\n"
              + "<!-- Version 1.0 -->\n"
              + "<Messages>\n"
              + "  <Message Name=\"Foo\">FooMessage</Message>\n"
              + "  <Message Name=\"Bar\">BarMessage</Message>\n"
              + "</Messages>"));
        }
    }
    

    输出:

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

    【讨论】:

      猜你喜欢
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      相关资源
      最近更新 更多