java基础学习之--XML

           刚学习完java中XML的知识点,由于涉及的知识点较多,在下文中进行简要总结,为以后复习以及对XML不了解的朋友学习之用。
        XML(Extensible Markup Language可扩展标记语言),XML是一个以文本来描述数据的文档。
一、常用的解析XML的工具:
1、DOM(Document Object Model)文档对象模型
2、SAX
3、JDOM
4、DOM4J

     总体来说,应该分成两类,一类是:DOM,另一类是SAX。而JDOM和DOM4J都是在DOM的基础上进行改进的。

二、具体的解析步骤和流程:
1、Dom解析XML:
(1)创建dom解析器工厂
(2)通过解析器工厂创建解析器
(3)构造一个指向指定文件的输入流
(4)开始解析,并返回Document对象
(5)根据文档的节点获取数据
(6)获取当前节点的属性的值
(7)获取当前节点下的所有子节点列表

相关代码为:

//创建dom解析器工厂
	DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
	  //通过解析器工厂创建解析器
	DocumentBuilder db=dbf.newDocumentBuilder();
	  //构造一个指向指定文件的输入流
	 InputStream is=Thread.currentThread().
	 getContextClassLoader().getResourceAsStream("person.xml");
	  //开始解析,并返回Document对象
	 Document doc=db.parse(is);
	 List<Teacher>teachers=new ArrayList<Teacher>();
	 Teacher t=null;
	 //根据文档的节点获取数据
	 NodeList nodeList=doc.getElementsByTagName("teacher");
	 t=new Teacher();
	 for (int i = 0; i < nodeList.getLength(); i++) {
		Node teacherNode=nodeList.item(i);
		 //获取当前节点的属性id的值
		 String id=teacherNode.getAttributes().getNamedItem("id").getNodeValue();
		 System.out.println(id);
		 t.setId(Integer.parseInt(id));//将字符串类型的id转换成整数
		  //获取当前节点下的所有子节点列表
		 NodeList childNodeList=teacherNode.getChildNodes();
		 for (int j = 0; j < childNodeList.getLength(); j++) {
			//获取主节点下的一个子节点
			Node childNode=childNodeList.item(j);
			String tagName=childNode.getNodeName();
			if("name".equals(tagName)){
				t.setName(childNode.getFirstChild().getNodeValue());
			}else if("desc".equals(tagName)){
				t.setDesc(childNode.getFirstChild().getNodeValue());
			}
		}
		  teachers.add(t);
	}
	 //输出
	 System.out.println(teachers);
2、Sax解析XML:
(1)创建SAX解析器工厂对象
(2)根据工厂创建解析器对象
(3)开始解析
在Sax解析XML时,一个重要的过程是创建SAX解析的内容处理器,该处理器需要继承DefaultHandler类,并重写其中的五个方法:
①XML文档开始解析时调用的方法startDocument()
②解析开始元素时调用的方法startElement(String uri, String localName, String qName,
Attributes attributes)
③解析结束元素时调用的方法 endElement(String uri, String localName, String qName)
④解析文本内容时调用的方法 characters(char[] ch, int start, int length)
⑤XML文档解析完成调用的方法endDocument() 

相关代码为:

public class PersonHandler extends DefaultHandler {
	private List<Teacher> teachers=null;
	private Teacher teacher;
	private String tag;
	
	public List<Teacher> getTeachers() {
		return teachers;
	}
//XML文档开始解析时调用的方法
 @Override
public void startDocument() throws SAXException {
	teachers=new ArrayList<Teacher>(); 
}
 //解析开始元素时调用的方法
 //uri:命名空间
 //localName:不带前缀的元素的本地名称
 //qName:带前缀的元素名称
 //attributes:属性的集合
 @Override
public void startElement(String uri, String localName, String qName,
		Attributes attributes) throws SAXException {
       if("teacher".equals(qName)){
    	   teacher=new Teacher();
    	   //取出属性,并添加到teacher中
    	  teacher.setId(Integer.parseInt(attributes.getValue("id"))) ;
       }
       tag=qName;
}
 //解析结束元素时调用的方法 
 @Override
public void endElement(String uri, String localName, String qName)
		throws SAXException {
	 if("teacher".equals(qName)){
		 teachers.add(teacher);
	 }
	 tag=null;
}
 //解析文本内容时调用的方法 
 @Override
public void characters(char[] ch, int start, int length)
		throws SAXException {
	 if(tag!=null){
	 if("name".equals(tag)){
		 teacher.setName(new String(ch,start,length));
	 }else if("desc".equals(tag)){
		 teacher.setDesc(new String(ch,start,length));
	 }
	 }
}
 
 //XML文档解析完成调用的方法
 @Override
public void endDocument() throws SAXException {
      System.out.println("XML解析完毕");
 }
}
3、JDOM解析XML:
(1)创建解析器
(2)开始解析
(3)获取根元素
(4)获取根元素下的所有子元素列表
(5)遍历
(6)获取当前元素的子元素的文本内容
(7)输出

相关代码为:

//创建解析器
      SAXBuilder builder=new SAXBuilder();
      InputStream in=Thread.currentThread().getContextClassLoader().getResourceAsStream("person.xml");
      //开始解析
      Document doc=builder.build(in);
      //获取根元素
      Element root=doc.getRootElement();
      //获取根元素下的所有子元素列表
      List<Element> list=root.getChildren();
      
      List<Teacher> teachers=new ArrayList<Teacher>();
      //遍历
      for (int i = 0; i < list.size(); i++) {
    	Teacher t=new Teacher();
		Element e=list.get(i);
		String id=e.getAttributeValue("id");
		t.setId(Integer.parseInt(id));
		//获取当前元素的子元素的文本内容
		t.setName(e.getChildText("name"));
		t.setDesc(e.getChildText("desc"));
		teachers.add(t);
	}
      //输出
      System.out.println(teachers);
	}
4、DOM4J解析XML:
(1)创建解析器
(2)开始解析,并返回Document对象
(3)获取根元素的所有子元素
(4)输出
相关代码为:

//创建解析器
		SAXReader reader=new SAXReader();
		InputStream in=Thread.currentThread().getContextClassLoader().getResourceAsStream("person.xml");
		//开始解析,并返回Document对象
		Document doc=reader.read(in);
		Element root=doc.getRootElement();
		//获取根元素的所有子元素
		Iterator<Element> iters=root.elementIterator();
		List<Teacher> list=new ArrayList<Teacher>();
		while(iters.hasNext()){
			Teacher t=new Teacher();
			Element e=iters.next();
		t.setId(Integer.parseInt(e.attributeValue("id")));
		t.setName(e.elementText("name"));
		t.setDesc(e.elementText("desc"));
		list.add(t);
		}
		//输出
		System.out.println(list); 
三、DOM和SAX的比较:
DOM在解析XML文档时,需要将XML文档全部读入内存中然后进行解析,所以使用DOM解析时对内存的消耗比较大;而SAX以事件的方式读入内存一行然后解析一行,不需要将文档全部读入内存,因此对内存的消耗较小。



你可能感兴趣的:(java,编程)