Java XML格式化程序
时间:2020-02-23 14:37:01 来源:igfitidea点击:
扩展标记语言(XML)是用于在不同应用程序之间进行消息传递和通信的流行媒介之一。
由于XML是开源的,并且可以通过DTD和XSD提供对数据格式的控制,因此它在各种技术中得到了广泛的使用。
Java XML格式化程序
几天前,我遇到了这样一种情况,即第三方API将Document对象和XML消息作为String返回。
因此,我编写了这个简单的XmlFormatter类,以使用适当的缩进来格式化XML,并将Document对象转换为XML String。
package com.theitroad.java.xmlutil;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
/**
* Utility Class for formatting XML
* @author hyman
*
*/
public class XmlFormatter {
/**
*
* @param unformattedXml - XML String
* @return Properly formatted XML String
*/
public String format(String unformattedXml) {
try {
Document document = parseXmlFile(unformattedXml);
OutputFormat format = new OutputFormat(document);
format.setLineWidth(65);
format.setIndenting(true);
format.setIndent(2);
Writer out = new StringWriter();
XMLSerializer serializer = new XMLSerializer(out, format);
serializer.serialize(document);
return out.toString();
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
/**
* This function converts String XML to Document object
* @param in - XML String
* @return Document object
*/
private Document parseXmlFile(String in) {
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource is = new InputSource(new StringReader(in));
return db.parse(is);
} catch (ParserConfigurationException e) {
throw new RuntimeException(e);
} catch (SAXException e) {
throw new RuntimeException(e);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* Takes an XML Document object and makes an XML String. Just a utility
* function.
*
* @param doc - The DOM document
* @return the XML String
*/
public String makeXMLString(Document doc) {
String xmlString = "";
if (doc != null) {
try {
TransformerFactory transfac = TransformerFactory.newInstance();
Transformer trans = transfac.newTransformer();
trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
trans.setOutputProperty(OutputKeys.INDENT, "yes");
StringWriter sw = new StringWriter();
StreamResult result = new StreamResult(sw);
DOMSource source = new DOMSource(doc);
trans.transform(source, result);
xmlString = sw.toString();
} catch (Exception e) {
e.printStackTrace();
}
}
return xmlString;
}
public static void main(String args[]){
XmlFormatter formatter = new XmlFormatter();
String book = "<?xml version=\"1.0\"?><catalog><book id=\"bk101\"><author>Gambardella, Matthew</author><title>XML Developers Guide</title><genre>Computer</genre><price>44.95</price><publish_date>2000-10-01</publish_date><description>An in-depth look at creating applications with XML.</description></book><book id=\"bk102\"><author>Ralls, Kim</author><title>Midnight Rain</title><genre>Fantasy</genre><price>5.95</price><publish_date>2000-12-16</publish_date><description>A former architect battles corporate zombies, an evil sorceress, and her own childhood to become queen of the world.</description></book></catalog>";
System.out.println(formatter.format(book));
}
}
要使用此类,您需要ApachexercesImpl.jar,可以从其下载。
上面类的输出是格式正确的XML字符串:
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developers Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
<description>An in-depth look at creating applications with XML.</description>
</book>
<book id="bk102">
<author>Ralls, Kim</author>
<title>Midnight Rain</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>2000-12-16</publish_date>
<description>A former architect battles corporate zombies, an evil
sorceress, and her own childhood to become queen of the world.</description>
</book>
</catalog>
我希望您会发现该实用程序类有助于在Java中格式化XML并将XML转换为Document,反之亦然。
更新资料
自从我撰写本文以来已经有很多年了,java已经发展了很多,我们可以使用javax.xml.transformAPI轻松格式化XML字符串。
package com.theitroad.java.xmlutil;
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
/**
* Utility Class for formatting XML
*
* @author hyman
*
*/
public class XmlFormatter {
public String format(String input) {
return prettyFormat(input, "2");
}
public static String prettyFormat(String input, String indent) {
Source xmlInput = new StreamSource(new StringReader(input));
StringWriter stringWriter = new StringWriter();
try {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, "yes");
transformer.setOutputProperty("{https://xml.apache.org/xslt}indent-amount", indent);
transformer.transform(xmlInput, new StreamResult(stringWriter));
return stringWriter.toString().trim();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void main(String args[]) {
XmlFormatter formatter = new XmlFormatter();
String book = "<?xml version=\"1.0\"?><catalog><book id=\"bk101\"><author>Gambardella, Matthew</author><title>XML Developers Guide</title><genre>Computer</genre><price>44.95</price><publish_date>2000-10-01</publish_date><description>An in-depth look at creating applications with XML.</description></book><book id=\"bk102\"><author>Ralls, Kim</author><title>Midnight Rain</title><genre>Fantasy</genre><price>5.95</price><publish_date>2000-12-16</publish_date><description>A former architect battles corporate zombies, an evil sorceress, and her own childhood to become queen of the world.</description></book></catalog>";
System.out.println(formatter.format(book));
}
}
输出将与之前的输出相同,您应该使用此输出,而不是添加对任何第三方API的依赖关系。

