带有正确格式注释的JAVA漂亮打印XML
我在尝试使用格式正确的注释漂亮地打印xml时遇到了一个问题。我从一个进程生成一个xml文件,需要向xml文档添加头信息。此标题信息的格式为xml注释 生成的文件如下所示:带有正确格式注释的JAVA漂亮打印XML,java,xml,xml-parsing,Java,Xml,Xml Parsing,我在尝试使用格式正确的注释漂亮地打印xml时遇到了一个问题。我从一个进程生成一个xml文件,需要向xml文档添加头信息。此标题信息的格式为xml注释 生成的文件如下所示: <Messages><Message Name="Foo">FooMessage</Message><Message Name="Bar">BarMessage</Message></Messages> FooMessageBarMessage 生成的
<Messages><Message Name="Foo">FooMessage</Message><Message Name="Bar">BarMessage</Message></Messages>
FooMessageBarMessage
生成的文件来自不同的进程,在该进程中,我无法修改其输出内容。生成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>
食物信息
条形码
但在我通过transformer运行它以漂亮地打印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()引发异常{
List header=Files.readAllLines(path.get(“header.xml”);
List message=Files.readAllLines(path.get(“messasges.xml”);
StringBuilder sb=新的StringBuilder();
for(字符串s:标题){
sb.append(字符串格式(“%s%n”,s));
}
for(字符串s:消息){
sb.append(字符串格式(“%s%n”,s));
}
write(path.get(“tmp.xml”)、sb.toString.getBytes()、StandardOpenOption.CREATE、StandardOpenOption.TRUNCATE_EXISTING);
DocumentBuilder db=DocumentBuilderFactor.newInstance().newDocumentBuilder();
Document doc=db.parse(path.get(“tmp.xml”).toFile());
字符串xmlStr=预打印(doc);
}
公共静态字符串预打印(文档文档)引发异常{
Transformer Transformer=TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT,“是”);
transformer.setOutputProperty(“{http://xml.apache.org/xslt}缩进金额”,4);
setOutputProperty(OutputKeys.ENCODING,“us ascii”);
setOutputProperty(OutputKeys.OMIT_XML_声明,“no”);
setOutputProperty(OutputKeys.DOCTYPE_PUBLIC,“是”);
DOMSource=新的DOMSource(doc);
StringWriter编写器=新的StringWriter();
StreamResult结果=新的StreamResult(writer);
变换(源、结果);
返回writer.getBuffer().toString();
}
如果您能提供任何帮助,我将不胜感激,因为我无法找到任何关于在各自行中保留评论的信息。恐怕您无法通过设置实现这一点。 使用一点蛮力:
return writer.getBuffer().toString().replaceAll("--><", "-->\n<");
return writer.getBuffer().toString().replaceAll(“-->\nhas methodU.formatXml(string)
。我是项目的维护者
导入com.github.underline.lodash.U;
公共类MyClass{
公共静态void main(字符串参数[]){
System.out.println(U.formatXml(“\n”
+“\n”
+“\n”
+“\n”
+“FooMessage\n”
+“BarMessage\n”
+ ""));
}
}
输出:
<?xml version="1.0" encoding="us-ascii"?>
<!-- Message Documentation -->
<!-- Version 1.0 -->
<Messages>
<Message Name="Foo">FooMessage</Message>
<Message Name="Bar">BarMessage</Message>
</Messages>
食物信息
条形码
你能告诉我标题和消息的内容吗?我在op中添加了一个编辑
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>