XML文件的解析—DOM、SAX

时间:2023-03-09 06:22:07
XML文件的解析—DOM、SAX

一、DOM 解析

思路:获得Document对象,遍历其中节点获得需要的内容

要点:

Document :  DocuemntBuilderFactory --newDocumentBuilder --parse(xml文件输入流)

根节点: getDocumentElement()

子节点 :NodeLIst list=root.getChildNodes();  Node n=list.item(index);

属性: element.getAttribute("id")  或者 node.getAttributes().getNamedItem("XXX").getNodeValue();

文本:node.getTextContent();  或者 node.getNodeValue();

部分代码:

         //1.  建立一个解析器工厂:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//2. 获得一个DocumentBuilder对象,这个对象代表了具体的DOM解析器
DocumentBuilder db = dbf.newDocumentBuilder();
//3. 将xml文件加载到内存中,得到表示整个文档的Document对象
InputStream inStream=DomParser.class.getClassLoader().getResourceAsStream("book.xml");
Document doc=db.parse(inStream);
//4. 根据标签名获得对应的Node集合
NodeList bookList=doc.getElementsByTagName("book");
//5. 对集合进行遍历
for(int i=0;i<bookList.getLength();i++){
Book book=new Book();
Element ele=(Element)bookList.item(i);//取出当前节点
String id=ele.getAttribute("id");//根据属性名获得属性值
book.setId(id);
Node nameNode=ele.getElementsByTagName("name").item(0);//获取唯一的name节点
String name=nameNode.getFirstChild().getNodeValue();//获得文本值
book.setName(name);
Node authorNode=ele.getElementsByTagName("author").item(0);//获取唯一的author节点
String author=authorNode.getFirstChild().getNodeValue();//获得文本值
book.setAuthor(author);
resultMap.put(book.getId(), book);

二、SAX解析

思路:获得SAXParser,调用parser 方法

要点:

工厂获得实例:SAXParserFactory — newSAXParser

parser.parse(input, handler); 该方法有两个参数,前一个是文件或者输入流,后一个是事件监听器(助手类)

新建助手类 继承 DefaultHandler ,重写需要的方法

部分代码:

 SaxParser:
//1. 将xml文件加载到内存中,得到表示整个文档的Document对象
InputStream inStream=DomParser.class.getClassLoader().getResourceAsStream("book.xml");
//2. 创建Sax解析工厂类
SAXParserFactory factory=SAXParserFactory.newInstance();
//3. 得的Sax解析器
SAXParser parser=factory.newSAXParser();
//4. 创建助手类的实例
SaxHandler handler=new SaxHandler();
//5. 解析文件
parser.parse(inStream, handler);
//6. 获得解析结果
List<Book> result=handler.getResultList();
for(Book b:result){
System.out.println(b);
}

事件监听器类(助手类):

在控制台打印信息,同时将信息封装入LIst

 public class MyDefaultHandler extends DefaultHandler{
List<Student> list=new ArrayList();
Student s=null; private String value;
@Override
public void startDocument() throws SAXException {
super.startDocument();
System.out.print("文档解析开始"); } @Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("\n文档解析结束");
System.out.println(list.toString());
} @Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException { if("student".equals(qName)){
System.out.println("\n学生信息:");
s=new Student();
s.setId(Integer.parseInt(attributes.getValue(0)));
}
if("name".equals(qName)){
System.out.print("姓名:"); }
if("telephone".equals(qName)){
System.out.print("电话:"); }
if("addrs".equals(qName)){
System.out.print("地址:"); }
} @Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.print(" ");
if("student".equals(qName)){
list.add(s);
} if("name".equals(qName)){
s.setName(value);
}
if("telephone".equals(qName)){
s.setTelephone(value);
}
if("addrs".equals(qName)){
s.setAddr(value);
} } @Override
public void characters(char[] ch, int start, int length)
throws SAXException {
value=new String(ch, start,length).trim();
System.out.print(value); }