【问题标题】:Pretty-print and incomplete XML漂亮的打印和不完整的 XML
【发布时间】:2021-07-31 18:25:53
【问题描述】:

我们有一个日志系统,我们可以在其中按需记录有效负载以进行故障排除和非生产。但是,由于列大小限制,如果 XML 超过 5000 个字符,我们会截断它。 XML 不是漂亮的打印格式,而是一个连续的字符串。

当 XML 被截断时,很难对其进行格式化以便于检查 XML 中的数据。通常,我使用 Java DocumentBuilderFactory 来格式化完整的 XML,但如果我们使用不完整的 XML,则会失败。

我想要一个可以格式化不完整的 XML 而不是抛出错误的解决方案。

【问题讨论】:

标签: java xml


【解决方案1】:

按照 Michael Kay 在他的答案中概述的方法,我在评论中链接到使用带有缩进 StreamSource 的身份转换器来捕获代码看起来像的任何解析异常

   String xml = "<root><section><p>Paragraph 1.</p><p>Paragraph 2."; //"<root><section><p>Paragraph 1.</p><p>Paragraph 2.</p></section></root>";

    Transformer identityTransformer = TransformerFactory.newInstance().newTransformer();

    identityTransformer.setOutputProperty("indent", "yes");

    StringWriter resultWriter = new StringWriter();

    StreamResult resultStream = new StreamResult(resultWriter);

    try {
        identityTransformer.transform(new StreamSource(new StringReader(xml)), resultStream);
    }
    catch (TransformerException e) {
        System.out.println(e.getMessageAndLocation());
        System.out.println(resultWriter.toString());
    }

然后至少,例如,到达最后一个 p 元素:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <section>
      <p>Paragraph 1.</p>
      <p

所以最后的一些信息丢失了,但在那个不完整的元素之前,代码至少将输入的长一行分成几行。

注意:我使用 Saxon 10 HE 作为默认 Transformer,如果您使用 JRE 或 Xalan,则需要设置 identityTransformer.setOutputProperty("{http://xml.apache.org/xalan}indent-amount", "2");,否则会出现换行符但没有缩进。

【讨论】:

  • 谢谢,马丁霍南。这就是我所需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 2020-04-28
  • 1970-01-01
  • 2010-10-20
  • 2023-03-07
  • 1970-01-01
相关资源
最近更新 更多