哈喽,小编又来啦,今天和大家分享一下利用dom4j生成与解析xml文件技术,小编今天研究了一天了,终于有了点成果,话不多说,上代码~
生成xml文件 :
public String createXML() {
Document doc = DocumentHelper.createDocument(); // 创建一个xml文档
doc.addComment("这里是注释"); // 向xml文件中添加注释
Element root = doc.addElement("phone"); // 创建一个名为phone的节点,因为是第一个创 建,所以是根节点,再通过doc创建一个则会报错。
Element haha = root.addElement("brand");
Element stuEle = haha.addElement("oppo"); // 在root节点下创建一个名为oppo的节点
stuEle.addAttribute("id", "oppo"); // 给oppo节点添加属性
Element nameEle = stuEle.addElement("name"); // 给oppo节点添加一个子节点
nameEle.setText("oppoFindX"); // 设置子节点的文本
Element priceEle = stuEle.addElement("price");
priceEle.setText("5499");
Element publish = stuEle.addElement("publish");
publish.setText("2018-05-11");
Element stuEles = haha.addElement("vivo");
stuEles.addAttribute("id", "vivo");
Element nameEles = stuEles.addElement("name");
nameEles.setText("vivoX21");
Element priceEles = stuEles.addElement("price");
priceEles.setText("4999");
Element publishs = stuEles.addElement("publish");
publishs.setText("2018-05-12");
OutputFormat format = OutputFormat.createPrettyPrint(); // 用于格式化xml内容和设置头部标签
format.setEncoding("utf-8"); // 设置xml文档的编码为utf-8
try {
// 创建一个输出流对象
//此方法生成的xml文件用notepad++打开中文显示乱码
//Writer out = new FileWriter("new.xml");
//此方法生成的xml文件用notepad++打开无乱码
FileOutputStream fos = new FileOutputStream(new File("E://new.xml"));
XMLWriter writer = new XMLWriter(fos, format); // 创建一个dom4j创建xml的对象
// 调用write方法将doc文档写到指定路径
writer.write(doc);
writer.close();
System.out.print("生成XML文件成功");
} catch (IOException e) {
System.out.print("生成XML文件失败");
e.printStackTrace();
}
return "";
}
调用方法:
public static void main(String[] args) {
XmlHandler handler = new XmlHandler();
handler.createXML();
}
大家写到:Writer out = new FileWriter("new.xml");此处时,一定要注意,小编一开始用该方法确实可以生成文件,但是用 notepad++打开时中文乱码,用记事本打开无乱码(其他的没有测);用FileOutputStream fos = new FileOutputStream(new File("E://new.xml"));这个方法,均无问题,到此xml文件生成成功~效果如下:
解析xml:这里介绍两种,解析xml文件,解析xml字符串(其实原理相同)
1、 解析xml文件:
public String parseXML(){
//SAXReader就是一个管道,用一个流的方式,把xml文件读出来
SAXReader reader = new SAXReader();
Document document;
try {
document = reader.read("E://new.xml");
//获取根节点
Element root = document.getRootElement();
//创建集合,迭代器依次找出后面的节点(有几个节点就迭代几次,循环也是一样)
List<Element> list = root.elements();
Iterator<Element> it = list.iterator();
while(it.hasNext()){
Element elm = it.next();
System.out.println(elm.getName() + ":");
Iterator<Element> its = elm.elementIterator();
while(its.hasNext()){
Element elme = its.next();
System.out.print(elme.getName() + ":");
Iterator<Element> itm = elme.elementIterator();
while(itm.hasNext()){
Element e = itm.next();
System.out.print(e.getName() + ":" + e.getText() + " ");
}
}
System.out.println();
}
} catch (DocumentException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return "";
}
调用方法:
public static void main(String[] args) {
XmlHandler handler = new XmlHandler();
handler.parseXML();
}
解析效果如下:输出格式看个人~
2、解析xml字符串:和解析文件一样,你定义的xml字符串有几个节点就迭代几次
public String parseXML(){
try {
//定义字符串
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"
+ "<phone><brand>"
+ "<oppo><name>oppoFindX</name><price>5499</price> <publish>2018-05-11</publish></oppo>"
+ "<vivo><name>vivoX21</name><price>4999</price><publish>2018-05-12</publish></vivo>"
+ "</brand></phone>";
SAXReader reader = new SAXReader();
Document document;
try {
document = reader.read(new ByteArrayInputStream(xml.getBytes("UTF-8")));
Element root = document.getRootElement();
List<Element> list = root.elements();
Iterator<Element> it = list.iterator();
while(it.hasNext()){
Element elm = it.next();
System.out.println(elm.getName() + ":");
Iterator<Element> its = elm.elementIterator();
while(its.hasNext()){
Element elme = its.next();
System.out.print(elme.getName() + ":");
Iterator<Element> itm = elme.elementIterator();
while(itm.hasNext()){
Element e = itm.next();
System.out.print(e.getName() + ":" + e.getText() + " ");
}
}
System.out.println();
}
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "";
}
调用方法:
public static void main(String[] args) {
XmlHandler handler = new XmlHandler();
handler.parseXML();
}
解析效果如下:输出格式看个人~