刚学习完java中XML的知识点,由于涉及的知识点较多,在下文中进行简要总结,为以后复习以及对XML不了解的朋友学习之用。
XML(Extensible Markup Language可扩展标记语言),XML是一个以文本来描述数据的文档。
一、常用的解析XML的工具:
1、DOM(Document Object Model)文档对象模型
2、SAX
3、JDOM
4、DOM4J
(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()
(1)创建解析器
(2)开始解析
(3)获取根元素
(4)获取根元素下的所有子元素列表
(5)遍历
(6)获取当前元素的子元素的文本内容
(7)输出
(1)创建解析器
(2)开始解析,并返回Document对象
(3)获取根元素的所有子元素
(4)输出
相关代码为:
DOM在解析XML文档时,需要将XML文档全部读入内存中然后进行解析,所以使用DOM解析时对内存的消耗比较大;而SAX以事件的方式读入内存一行然后解析一行,不需要将文档全部读入内存,因此对内存的消耗较小。
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以事件的方式读入内存一行然后解析一行,不需要将文档全部读入内存,因此对内存的消耗较小。