java解析XML的四种方式-学习总结

哪四种:JDOM、DOM4J、DOM、SAX。(目前比较常用的:JDOM、DOM4J)

第一种:JDOM

简化与XML的交互并且比使用DOM实现更快,仅使用具体类而不使用接口因此简化了API,并且易于使用。

    (1).Jdom生成XML:   

<?xml version="1.0" encoding="gbk"?>
<联系人列表 公司="A集团">
  <联系人>
    <姓名>张三</姓名>
    <公司>A公司</公司>
    <电话>021-55556666</电话>
    <地址>
      <街道>5街</街道>
      <城市>上海</城市>
      <省份>上海市</省份>
    </地址>
  </联系人>
</联系人列表>
代码如下:
import java.io.FileWriter;
import java.io.StringReader;
import java.util.List;
import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
import org.xml.sax.InputSource;

public class ParseXML_Jdom {
	//JDOM解析xml:
	public static void main(String[] args) throws Exception {  
	    Document document = new Document();   
	    Element root = new Element("联系人列表").setAttribute(new Attribute("公司","A集团"));   
	    document.addContent(root);   
	       
	    Element contactPerson = new Element("联系人");   
	    root.addContent(contactPerson);   
	    contactPerson   
	        .addContent(new Element("姓名").setText("张三"))   
	        .addContent(new Element("公司").setText("A公司"))   
	        .addContent(new Element("电话").setText("021-55556666"))   
	        .addContent(   
	            new Element("地址")   
	                .addContent(new Element("街道").setText("5街"))   
	                .addContent(new Element("城市").setText("上海"))   
	                .addContent(new Element("省份").setText("上海市")));   
	    
	    XMLOutputter output = new XMLOutputter(Format.getPrettyFormat()
	    		.setIndent("  ").setEncoding("gbk"));//UTF-8
	    output.output(document, new FileWriter("D:\\contact.xml"));
		
		
//		Document document = new Document();   
//	    Element root = new Element("class");
//	    root.setAttribute(new Attribute("classLevel","一年级"));   
//	    root.setAttribute(new Attribute("classNo","1班"));   
//	    document.addContent(root);
//	    
//	    Element teacher = new Element("teacher");   
//	    teacher.setAttribute(new Attribute("name","班主任"));   
//	    teacher.setAttribute(new Attribute("sex","female"));  
//	    root.addContent(teacher); 
//	       
//	    Element student1 = new Element("student").setAttribute(new Attribute("name","学生1"));   
//	    Element student2 = new Element("student").setAttribute(new Attribute("name","学生2"));   
//	    Element student3 = new Element("student").setAttribute(new Attribute("name","学生3"));   
//	    root.addContent(student1);   
//	    root.addContent(student2);   
//	    root.addContent(student3);   
//	    
//	    XMLOutputter output = new XMLOutputter(Format.getPrettyFormat()
//	    		.setIndent("  ").setEncoding("gbk"));//UTF-8
//	    output.output(document, new FileWriter("D:\\class.xml"));
		
	    System.out.println("输出成功!");
	  }

}

(2).Jdom解析XML:

import java.io.FileWriter;
import java.io.StringReader;
import java.util.List;
import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
import org.xml.sax.InputSource; 
public class ParseXML_Jdom {
        //JDOM解析xml:
	public static void main(String[] args) throws Exception {
		try {
	/*
	 * 以下为描述班级的xml
	 * <xml version=\"1.0\" encoding=\"UTF-8\">定义xml编码格式,可写可不写,规范是写
	 */
	String resultXml = 
		"<xml version=\"1.0\" encoding=\"UTF-8\">" +//这是根节点
			"<class classLevel=\"一年级\" classNo=\"1班\" >" 
				+ "<teacher name=\"班主任\" sex=\"female\" />" //单数子节点!子一代:getChild
				+ "<student name=\"学生1\" age=\"5\" seat=\"A\" />"
				+ "<student name=\"学生2\" age=\"6\" seat=\"B\" />"
				+ "<student name=\"学生3\" age=\"7\" seat=\"C\" />"//student复数子节点:getChildren
			+ "</class>"
		+ "</xml>";
						
			StringReader read = new StringReader(resultXml);
			InputSource source = new InputSource(read);
			SAXBuilder sb = new SAXBuilder();
			Document document = sb.build(source);
			//document.getRootElement();//得到的是根节点
			Element root = document.getRootElement();//得到的是根节点
			System.out.println("根节点:"+root.getName()+"-"+root.getQualifiedName());
			String version = root.getAttribute("version").getValue();//根节点里的参数属性
			String encoding = root.getAttributeValue("encoding");//root.getAttribute("encoding").getValue();
			System.out.println(version);
			System.out.println(encoding);
			
			//root.getChild("$")得到的是单独唯一的一个下层字节点,是单数!
	      	        Element classElement = root.getChild("class");
	      	        System.out.println("子节点一代:"+classElement.getQualifiedName());
	      	        String classLevel = classElement.getAttributeValue("classLevel");
	      	        String classNo = classElement.getAttributeValue("classNo");
	              	System.out.println(classLevel);
	              	System.out.println(classNo);
	      	
	              	//classElement.getChild("$")得到的是单独唯一的一个下层字节点,是单数!
	              	Element teacherElement = classElement.getChild("teacher");
	              	System.out.println("老师:"+teacherElement.getQualifiedName());
	          	String name = teacherElement.getAttributeValue("name");
	          	String sex = teacherElement.getAttributeValue("sex");
	          	System.out.println(name);
	          	System.out.println(sex);
	      	
	          	//classElement.getChildren("$")得到的是一组子代,是复数
	      	        List<Element> students = classElement.getChildren("student");
	          	System.out.println("我是一组子代:");
	          	System.out.println(students);
	          	if(null != students){
	      		    String sname="", age="", seat="";
	      		    for(Element student : students){
	      			sname = student.getAttributeValue("name");
	      			age = student.getAttributeValue("age");
	      			seat = student.getAttributeValue("seat");
	      			System.out.println(sname+","+age+","+seat);
	      		    }
	      	        }
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

第二种:DOM4J

是JDOM的一种智能分支,功能较强大,建议熟练使用

(1).DOM4J生成以下XML:

<?xml version="1.0" encoding="UTF-8"?>
<student country="China">
    <name inEnglish="San.Zhang">张三</name>
    <sex>boy</sex>
</student>

生成代码如下:

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.util.Iterator;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.DOMReader;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class ParseXML_Dom4j {
	public static void main(String[] args) throws Exception{
		try {
		    // 创建文档并设置文档的根元素节点 :第一种方式   
		    // Document document = DocumentHelper.createDocument();   
		    // Element root = DocumentHelper.createElement("student");   
		    // document.setRootElement(root);   
		   
		    // 创建文档并设置文档的根元素节点 :第二种方式   
		    Element root = DocumentHelper.createElement("student");   
		    Document document = DocumentHelper.createDocument(root);   
		   
		    root.addAttribute("country", "China");   
		   
		    Element name = root.addElement("name");
		    Element sex = root.addElement("sex");
		   
		    name.setText("张三");
		    sex.setText("boy");
		   
		    name.addAttribute("inEnglish", "San.Zhang");
		   
		    XMLWriter xmlWriter = new XMLWriter();   
		    xmlWriter.write(document);//印屏:打印在console里,不在文件里
		    
		    //打印格式
		    OutputFormat format = new OutputFormat("  ", true); //"  "是为了每行缩进
		    //打印到指定文件:方式一
		    XMLWriter xmlWriter2 = new XMLWriter(new FileOutputStream("D:\\student2.xml"), format);   
		    xmlWriter2.write(document);   
		    //打印到指定文件:方式二
		    XMLWriter xmlWriter3 = new XMLWriter(new FileWriter("D:\\student3.xml"), format);   
		    xmlWriter3.write(document);  
		    xmlWriter3.close();   
		    
		    System.out.println("输入成功!");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

(2).DOM4J解析XML:

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.util.Iterator;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.DOMReader;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class A_ParseXML_Dom4j {
	public static void main(String[] args) throws Exception{ 
            try {
		System.out.println("-------------dom4j解析方式一:--------------");
		//dom4j解析方式一:
		SAXReader saxReader = new SAXReader();   
		Document doc = saxReader.read(new File("D:\\student2.xml"));
		Element root = doc.getRootElement();   
		System.out.println("root element: " + root.getName());   
		       
		    List<Element> childList = root.elements();   
		    System.out.println(childList.size());   
		    
		    List<Element> childList2 = root.elements("name");   
		    System.out.println(childList2.size());   
		       
		    Element first = root.element("name");
		    System.out.println(first.attributeValue("inEnglish"));   
		       
		    for(Iterator iter = root.elementIterator(); iter.hasNext();){   
		    	Element e = (Element)iter.next();
		    	System.out.println(e.attributeValue("inEnglish"));
		    }   
		       
		    System.out.println("-------------dom4j解析方式二:--------------");
		    
		    //dom4j解析方式二:利用javax.xml.parsers.*-jar包
		    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();   
		    DocumentBuilder db = dbf.newDocumentBuilder();   
		    org.w3c.dom.Document document = db.parse(new File("D:\\student2.xml"));   
		       
		    DOMReader domReader = new DOMReader();   
		       
		    //将JAXP的Document转换为dom4j的Document   
		    Document d = domReader.read(document);   
		       
		    Element rootElement = d.getRootElement();   
		    System.out.println(rootElement.getName());
		    
	    } catch (Exception e) {
		e.printStackTrace();
	    }
	}
}

第三种:DOM

DOM的全称是Document Object Model,也即文档对象模型。Dom解析是将xml文件全部载入到内存,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件,与平台无关,java提供的一种基础的解析XML文件的API,理解较简单,但是由于整个文档都需要载入内存,不适用于文档较大时。

种:SAX

sax:SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX基于事件驱动,逐条解析,适用于只处理xml数据,不易编码,而且很难同时访问同一个文档中的多处不同数据


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值