Java 8中的漂亮打印XML

我有一个存储为DOM文档的XML文件,我想将其漂亮地打印到控制台,最好不使用外部库。

我正在使用Java

8,所以也许这是我的代码与以前的问题有所不同的地方?我也尝试过使用从Web上找到的代码手动设置变压器,但是这只是引起了not found错误。

这是我的代码,当前仅在控制台左侧的新行上输出每个xml元素。

import java.io.*;

import javax.xml.parsers.*;

import javax.xml.transform.*;

import javax.xml.transform.dom.DOMSource;

import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;

import org.xml.sax.InputSource;

import org.xml.sax.SAXException;

public class Test {

public Test(){

try {

//java.lang.System.setProperty("javax.xml.transform.TransformerFactory", "org.apache.xalan.xsltc.trax.TransformerFactoryImpl");

DocumentBuilderFactory dbFactory;

DocumentBuilder dBuilder;

Document original = null;

try {

dbFactory = DocumentBuilderFactory.newInstance();

dBuilder = dbFactory.newDocumentBuilder();

original = dBuilder.parse(new InputSource(new InputStreamReader(new FileInputStream("xml Store - Copy.xml"))));

} catch (SAXException | IOException | ParserConfigurationException e) {

e.printStackTrace();

}

StringWriter stringWriter = new StringWriter();

StreamResult xmlOutput = new StreamResult(stringWriter);

TransformerFactory tf = TransformerFactory.newInstance();

//tf.setAttribute("indent-number", 2);

Transformer transformer = tf.newTransformer();

transformer.setOutputProperty(OutputKeys.METHOD, "xml");

transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");

transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");

transformer.setOutputProperty(OutputKeys.INDENT, "yes");

transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");

transformer.transform(new DOMSource(original), xmlOutput);

java.lang.System.out.println(xmlOutput.getWriter().toString());

} catch (Exception ex) {

throw new RuntimeException("Error converting to String", ex);

}

}

public static void main(String[] args){

new Test();

}

}

回答:

我想这个问题与原始文件中的

(即只有空白的文本节点)有关。您应该尝试在解析后使用以下代码以编程方式删除它们。如果不删除它们,Transformer它将保留它们。

original.getDocumentElement().normalize();

XPathExpression xpath = XPathFactory.newInstance().newXPath().compile("//text()[normalize-space(.) = '']");

NodeList blankTextNodes = (NodeList) xpath.evaluate(original, XPathConstants.NODESET);

for (int i = 0; i < blankTextNodes.getLength(); i++) {

blankTextNodes.item(i).getParentNode().removeChild(blankTextNodes.item(i));

}

以上是 Java 8中的漂亮打印XML 的全部内容, 来源链接: utcz.com/qa/402163.html

回到顶部