实现xml与json的互相转换,先实现xml -> json, 然后实现json -> xml字符串,最后xml字符串 -> 写入文件
XML
结构时常会转换为JSON
数据结构,感恩开源,有json
的开源包帮忙解决问题。
下面代码是xml转json的快速方法
public static String xmlToJson() throws Exception{
//使用DOM4j
SAXReader saxReader = new SAXReader();
//读取文件
Document read = saxReader.read("G:\\IDEAProjects\\JavaStudy\\Mooc\\src\\main\\resources\\score.xml");
//使用json的xml转json方法
JSONObject jsonObject = XML.toJSONObject(read.asXML());
//设置缩进转为字符串
System.out.println(jsonObject.toString(3));
return jsonObject.toString(3);
}
测试xml文件如下
<student>
<name>Tomname>
<subject>mathsubject>
<score>80score>
student>
输出结果:
{"student":
{
"score": 80,
"subject": "math",
"name": "Tom"
}
}
//json转换成xml
public static String jsonToXml(String json){
//输入流
StringReader input = new StringReader(json);
//输出流
StringWriter output = new StringWriter();
//构建配置文件
JsonXMLConfig config = new JsonXMLConfigBuilder().multiplePI(false).repairingNamespaces(false).build();
try {
//xml事件读
// This is the top level interface for parsing XML Events. It provides
// the ability to peek at the next event and returns configuration
// information through the property interface.
// 这是最解析XML事件最顶层的接口,它提供了查看下一个事件并通过属性界面返回配置信息的功能。
XMLEventReader reader = new JsonXMLInputFactory(config).createXMLEventReader(input);
//这是编写XML文档的顶级界面。
//验证XML的形式不需要此接口的实例。
XMLEventWriter writer = XMLOutputFactory.newInstance().createXMLEventWriter(output);
//创建一个实例使用默认的缩进和换行
writer = new PrettyXMLEventWriter(writer);
//添加整个流到输出流,调用next方法,知道hasnext返回false
writer.add(reader);
reader.close();
writer.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
output.close();
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//移除头部标签
if (output.toString().length() >= 38) {
System.out.println(output.toString().substring(39));
return output.toString().substring(39);
}
System.out.println(output);
return output.toString();
}
传入的json字符串即上xml转json中输出的,json转xml的结果如下:
此时是没有头部,在文中被移除!
<student>
<score>80score>
<subject>mathsubject>
<name>Tomname>
student>
传入xml字符串,利用DOM4J工具即可输出到指定的文件
public static void writeXmlToFile(String xmlStr) throws Exception{
//将xmlstr转为文件形式
Document document = DocumentHelper.parseText(xmlStr);
//设置输出的格式
OutputFormat format = OutputFormat.createPrettyPrint();
//构建输出流
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("newXml.xml"), format);
//不要转义字符
xmlWriter.setEscapeText(false);
//写入
xmlWriter.write(document);
//关闭流
xmlWriter.close();
}
如下的依赖就足够了
<dependency>
<groupId>org.jsongroupId>
<artifactId>jsonartifactId>
<version>20171018version>
dependency>
<dependency>
<groupId>dom4jgroupId>
<artifactId>dom4jartifactId>
<version>1.6.1version>
dependency>
<dependency>
<groupId>de.odysseus.staxongroupId>
<artifactId>staxonartifactId>
<version>1.3version>
dependency>
public class Main {
public static void main(String[] args)throws Exception {
//将xml转化成json
String jsonStr = xmlToJson();
//将json转换成xml
String xmlStr = jsonToXml(jsonStr);
//将json按照响应格式写入score2.xml
writeXmlToFile(xmlStr);
}
public static String xmlToJson() throws Exception{
//使用DOM4j
SAXReader saxReader = new SAXReader();
//读取文件
Document read = saxReader.read("G:\\IDEAProjects\\JavaStudy\\Mooc\\src\\main\\resources\\score.xml");
//使用json的xml转json方法
JSONObject jsonObject = XML.toJSONObject(read.asXML());
//设置缩进转为字符串
System.out.println(jsonObject.toString(3));
return jsonObject.toString(3);
}
public static void writeXmlToFile(String xmlStr) throws Exception{
//将xmlstr转为文件形式
Document document = DocumentHelper.parseText(xmlStr);
//设置输出的格式
OutputFormat format = OutputFormat.createPrettyPrint();
//构建输出流
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("G:\\IDEAProjects\\JavaStudy\\Mooc\\src\\main\\resources\\score2.xml"), format);
//不要转义字符
xmlWriter.setEscapeText(false);
//写入
xmlWriter.write(document);
//关闭流
xmlWriter.close();
}
//json转换成xml
public static String jsonToXml(String json){
//输入流
StringReader input = new StringReader(json);
//输出流
StringWriter output = new StringWriter();
//构建配置文件
JsonXMLConfig config = new JsonXMLConfigBuilder().multiplePI(false).repairingNamespaces(false).build();
try {
//xml事件读
// This is the top level interface for parsing XML Events. It provides
// the ability to peek at the next event and returns configuration
// information through the property interface.
// 这是最解析XML事件最顶层的接口,它提供了查看下一个事件并通过属性界面返回配置信息的功能。
XMLEventReader reader = new JsonXMLInputFactory(config).createXMLEventReader(input);
//这是编写XML文档的顶级界面。
//验证XML的形式不需要此接口的实例。
XMLEventWriter writer = XMLOutputFactory.newInstance().createXMLEventWriter(output);
//创建一个实例使用默认的缩进和换行
writer = new PrettyXMLEventWriter(writer);
//添加整个流到输出流,调用next方法,知道hasnext返回false
writer.add(reader);
reader.close();
writer.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
output.close();
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//移除头部标签
if (output.toString().length() >= 38) {
System.out.println(output.toString().substring(39));
return output.toString().substring(39);
}
System.out.println(output);
return output.toString();
}
}