导图社区 xml解析dom、sax知识点学习笔记
这是一篇关于xml解析dom、sax知识点学习笔记的思维导图,对xml解析dom、sax知识点学习笔记感兴趣的小伙伴可以点赞加收藏
编辑于2022-11-18 10:05:38 广东xml解析dom、sax知识点学习笔记
dom
总结:技术
1、获得Document 对象
调用解析器工厂实例类的 newDocumentBuilder()
DocumentBuilderFactory.newInstance() 方法得到 DOM 解析器工厂类实例
2、调用interface Document
A获得根节点getDocumentElement();
该接口定义分析并创建DOM文档的一系列方法,它是文档树的根,是操作DOM的基础。
3、使用接口Element
getAttributes()
获取此元素包含的属性集合。
getName()
获取元素的名称。
getElementsByTagName()
getElementById()通过ID来取得元素
该接口继承Node接口,提供了获取、修改XML元素名字和属性的方法。
node
该接口提供处理并获取节点和子节点值的方法
NodeList
提供获得节点个数和当前节点的方法,访问各个节点
DOMParser
该类是Apache的DOM解析器类,可直接解析XML文件。
主
定义集合接收多个类对象,用于接收数据
List<Book> books=new ArrayList<Book>();
定义要操作的Xml文件路径
3.指定要解析的Xml文件并返回文档对象
1.得到DOM解析器工厂对象
DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();
2.通过工厂对象生成DOM解析器对象
DocumentBuilder documentBuilder= documentBuilderFactory.newDocumentBuilder();
3、Document document= documentBuilder.parse(new File(path));
4、直接获得
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File(path));
4.得到当前Xml文件的根节点对象
Element root=document.getDocumentElement();
5.对Xml节点进行增删改查操作
通过根节点去获得子节点
NodeList book_nodeList=root.getElementsByTagName("book");
6、遍历节点集合
int len=book_nodeList.getLength();
for(int i=0;i<len;i++){
Node book_node=book_nodeList.item(i);
Element book_elt=(Element) book_node;
节点集合引向父类
String id=book_elt.getAttribute("id");
//得到name的第一个节点对象
Node name_node=book_elt.getElementsByTagName("name").item(0);
//得到name节点的文本元素
String name=name_node.getTextContent();
Book book=new Book(Integer.parseInt(id),name,author,publish);
books.add(book);
System.out.println("id="+id+",name="+name+",author="+author+",publish="+publish);
sax
优势
sax解析的获得
自定义处理器对象
Attrbutes
getValue() 返回此 Attribute 值的 Object
getName()
DefaultHandler
劣势
1、定义要操作的Xml文件路径path
2.得到SAX解析器对象
SAXParser saxParser= SAXParserFactory.newInstance().newSAXParser();
3.得到XmlReader对象
SAXParser saxParser= saxParserFactory.newSAXParser();
4.开启启动命名空间功能
reader.setFeature("http://xml.org/sax/features/namespaces", true);
5.通过解析器对象指定要解析的Xml和处理器对象
saxParser.parse(new File(path), new MyHandler());
6、自定义处理器对象 handler
class MyHandler extends DefaultHandler
7、对文档进行顺序扫描,定义初始化变量
当前解析节点的父节点名称
private String parent;
存储解析出来的数据封装成book对象后的集合
private List<Book> books;
private Book book;
解析操作
初始化startDocument()
this.books=new ArrayList<Book>();
在整个Xml解析过程中只被调用一次
2、遇到Xml的开始标签<name>
startElement(String uri, String localName, String qName,Attributes attributes)
Attributes attributes)
将当前名称设置为父节点
this.parent=localName;
判断该节点是否树根节点下的子节点
if("book".equals(localName)){
this.book=new Book();
String id=attributes.getValue(0);
this.book.setId(Integer.parseInt(id));
字符数据,空白元素(空串,回车,换行)
创建字符串获取内容
String data=new String(ch,start,length);
判断内容对应的属性值
if("name".equals(this.parent)){
this.book.setName(data);
加入对象集合
this.books.add(book);
结束标签endElement</>
设置当前父节点为空
this.parent=null;
endDocument()
解析完成Xml文档可输出
System.out.println("books="+books);
pull
优势
XmlPullParser
提供了定义解析功能的接口
getEventType();
XmlPullParser.END_DOCUMENT=1
String id=parser.getAttributeValue(null, "id")
String name=parser.nextText();
劣势
1、定义要操作的Xml文件路径
String path="src"+File.separator+"books.xml";
2、得到PULL解析器对象
XmlPullParser parser= XmlPullParserFactory.newInstance();.newPullParser();
3.指定要解析的Xml和编码表
InputStream inputStream=new FileInputStream(path);
parser.setInput(inputStream,"UTF-8");
4.得到事件类型
int eventType=parser.getEventType();
5、while遍历事件
while(eventType!=XmlPullParser.END_DOCUMENT){
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
books=new ArrayList<Book>();
System.out.println("====XmlPullParser.START_DOCUMENT===");
break;
case XmlPullParser.START_TAG:
//得到当前节点的名称
String startTag=parser.getName();
if("book".equals(startTag)){
String id=parser.getAttributeValue(null, "id");//uri 值为null;
book=new Book();
book.setId(Integer.parseInt(id));
}else if("name".equals(startTag)){
String name=parser.nextText();
book.setName(name);
}else if("author".equals(startTag)){
String author=parser.nextText();
book.setAuthor(author);
}else if("publish".equals(startTag)){
String publish=parser.nextText();
book.setPublish(publish);
break;
case XmlPullParser.END_TAG:
//得到当前节点的名称
String endTag=parser.getName();
if("book".equals(endTag)){
books.add(book);
book=null;
break;
case XmlPullParser.TEXT:
break;
eventType=parser.next();
将事件向后推动