尝试用正确格式的注释漂亮地打印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();
}
任何帮助将不胜感激,因为我无法找到有关保留各自行注释的任何信息。
答案 0 :(得分:3)
恐怕您无法通过设置来实现。 使用一些蛮力:
return writer.getBuffer().toString().replaceAll("--><", "-->\n<");
答案 1 :(得分:0)
Underscore-java具有方法U.formatXml(string)
。我是该项目的维护者。 Live example
import com.github.underscore.lodash.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>