【发布时间】:2010-11-18 21:18:58
【问题描述】:
使用以下简单代码:
package test;
import java.io.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
public class TestOutputKeys {
public static void main(String[] args) throws TransformerException {
// Instantiate transformer input
Source xmlInput = new StreamSource(new StringReader(
"<!-- Document comment --><aaa><bbb/><ccc/></aaa>"));
StreamResult xmlOutput = new StreamResult(new StringWriter());
// Configure transformer
Transformer transformer = TransformerFactory.newInstance()
.newTransformer(); // An identity transformer
transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "testing.dtd");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(xmlInput, xmlOutput);
System.out.println(xmlOutput.getWriter().toString());
}
}
我得到了输出:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Document comment --><!DOCTYPE aaa SYSTEM "testing.dtd">
<aaa>
<bbb/>
<ccc/>
</aaa>
问题 A:doctype 标签出现在文档注释之后。是否可以让它出现在文档注释之前?
问题 B:如何实现缩进,仅使用 JavaSE 5.0 API? 此问题与How to pretty-print xml from java 基本相同,然而该问题中的几乎所有答案都依赖于外部库。仅使用 java api 的唯一适用答案(由名为 Lorenzo Boccaccia 的用户发布)基本上等于上面发布的代码,但对我不起作用(如输出所示,我没有缩进)。
我猜你必须设置用于缩进的空格数量,正如外部库的许多答案所做的那样,但我只是找不到在 java api 中指定的位置。鉴于在 java api 中存在将缩进属性设置为“是”的可能性,因此必须能够以某种方式执行缩进。我就是想不通。
【问题讨论】:
-
问题 A 没有意义。您是指第二部分中的“之前”吗?
-
是的。我编辑了问题以更改拼写错误。谢谢。
-
重复我在stackoverflow.com/questions/139076/… 中所做的评论 - 您现在可以在没有外部库的情况下进行漂亮的打印。见xerces.apache.org/xerces2-j/faq-general.html#faq-6。是的,这是一个 Xerces 常见问题解答,但答案涵盖了标准 JDK 类。这些类的最初 1.5 实现有很多问题,但从 1.6 开始一切正常。复制 FAQ 中的 LSSerializer 示例,去掉“...”位并在
LSSerializer writer = ...行之后添加writer.getDomConfig().setParameter("format-pretty-print", Boolean.TRUE);。 -
此代码 sn-p 易受 XML 外部实体注入 (XXE) 的攻击。见cheatsheetseries.owasp.org/cheatsheets/…
标签: java xml pretty-print