1.DOM(Document Object Model)文档对象模型-----核心(core)、Html、Xml
对于XML应用开发来说,DOM就是一个对象化的XML数据接口,一个与语言无关,与平台无关的标准接口规范。
2. 要严格区分XML文档树中的根结点与根元素结点:
根节点(Document)代表的是XML文档本身,是我们解析XML文档的入口,而根元素结点则表示XML文档的根元素,它对应于XML文档的Root。
3. JAXP(Java API for XML Parsing):用于XML解析的Java API。
4. 对于XML解析器而言,空格不被忽略。
5. SAX(Simple APIs for XML)面向XML的简单API。
6. 使用DOM解析XML时,首先将XML文件加载到内存 中,然后通过随机的方式访问内存中的DOM树。
SAX是基于事件,而且是顺序执行的,一旦经过了某个元素,我们就不能再访问它了。
SAX不必事先将整个XML文档加载到内存中,因此它占据内存比DOM小,对于大型XML文档来说,通常会使用SAX而不是用DOM。
7.SAX也是使用的观察者模式
下面给出使用DOM和SAX解析XML的实例代码
a.使用SAX解析XML的实例
public class SaxParserStudent {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
SAXParserFactory apf = SAXParserFactory.newInstance();
SAXParser saxParser = apf.newSAXParser();
saxParser.parse(new File("doc/student.xml"),new MyHandler2());
}
}
class MyHandler2 extends DefaultHandler{
private String name;
private String gender;
private String age;
Stack<String> stack = new Stack<String>();//SAX是基于事件,而且是顺序执行的,一旦经过了某个元素,我们就不能再访问它了,所以需要将解析的元素先放到stack中,当解析完毕后再从stack中取出。
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
stack.push(qName);
for(int i = 0; i <attributes.getLength();i ++){
String attribute = attributes.getQName(i);
String attributeValue = attributes.getValue(i);
System.out.println(attribute + ":" + attributeValue);
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String tag = stack.peek();
if(("姓名").equals(tag)){
name = new String(ch,start,length);
}else if(("性别").equals(tag)){
gender = new String(ch,start,length);
}else if(("年龄").equals(tag)){
age = new String(ch,start,length);
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
stack.pop();//表示该元素已经解析完毕,需要从栈中弹出
if("姓名".equals(qName)){
System.out.println("姓名:" + name);
}else if("性别".equals(qName)){
System.out.println("性别:" + gender);
}else if("年龄".equals(qName)){
System.out.println("年龄:" + age);
System.out.println();
}
}
}
b.使用DOM解析XML实例
public class DomParserCandidate {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
// step 1:获得DOM解析器工厂(用于创建具体的DOM解析器)
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//step 2:获得具体的DOM解析器
DocumentBuilder db = dbf.newDocumentBuilder();
//step 3:解析一个XML文档,获得Document对象。
Document candidate = db.parse(new File("doc/candidate.xml"));
NodeList persons = candidate.getElementsByTagName("PERSON");
for(int i = 0; i < persons.getLength(); i++){
Element nameElement = (Element) persons.item(i);
String name = nameElement.getElementsByTagName("NAME").item(0).getFirstChild().getNodeValue();
System.out.println("name:" + name );
Element addressElement = (Element) persons.item(i);
String address = addressElement.getElementsByTagName("ADDRESS").item(0).getFirstChild().getNodeValue();
System.out.println("address:" + address);
Element telElement = (Element) persons.item(i);
String tel = telElement.getElementsByTagName("TEL").item(0).getFirstChild().getNodeValue();
System.out.println("tel:" + tel);
Element faxElement = (Element) persons.item(i);
String fax = faxElement.getElementsByTagName("FAX").item(0).getFirstChild().getNodeValue();
System.out.println("fax:" + fax);
Element emailElement = (Element) persons.item(i);
String email = emailElement.getElementsByTagName("EMAIL").item(0).getFirstChild().getNodeValue();
System.out.println("email:" + email);
}
}
}