SAX解析:
特点:
基于事件处理机制的解析(sax)
(1)边读边解析
(2)不能回读,如果遇到未处理的事件,要重新读取
(3)轻量级,速度快
(4)适合处理较大的xml文档
(5)只能读取,不能修改
代码:
SAXParserFactory 创建SaxparserFacory工厂:这个工厂是用来产生SAXParser实例
SAXParser sax解析器
parse(File f, HandlerBase hb);
DefaultHandler 默认的处理类 需要写一个类继承它
默认处理类中常用方法:
1, startDocument(); 这个方法只是在解析xml的时候执行一次
2, endDocument(); 解析xml结束时调用,只调用一次
// 遇到开始标签调用该方法,调用n次
3, startElement(String uri, String localName, String qName,Attributes attributes)
uri:指向一个唯一的地址 一般不使用
localName 加上命名空间的名字,如果没有设置命名空间,值为null
qName:当前标签名
attributes:封装了开始标签中属性的信息
attributes.getQName(i);拿到第几个属性的属性名
attributes.getValue(i);拿到第几个属性的属性值
attributes.getLength();该标签属性的个数
4, endElement();遇到结束标签的时候调用
5, characters(char[] ch, int start, int length);遇到文本域的时候执行该方法
DOM解析:
特点:
基于树形结构的解析(dom)
(1)先将整个xml文档加载到内存,形成树形结构,再解析
(2)可以重复读取
(3)重量级,速度慢
(4)适合处理较小的xml文档
(5)能够进行增、删、改、查
代码:
javax.xml.parsers.DocumentBuilderFactory;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();// 获取dom解析器工厂
javax.xml.parsers.DocumentBuilder;
DocumentBuilder build= factory.newDocumentBuilder();//获取dom解析器
org.w3c.dom.Document;
Document doc = build.parse(new File("src/com/briup/xml/sax/Test.xml"));解析xml文件;
org.w3c.dom.Element;
Element root = doc.getDocumentElement();// 获取根节点
NodeList list = root.getElementsByTagName("time"); 拿多个time(元素)节点 取文本 相加 完成
Element e = (Element)list.item(i);//获取第i号位上的 标签
e.getNodeName()//获取标签名
e.getTextContent()//获取标签中所有的文本值,在该标签下其他标签中的文本也会获取到
NamedNodeMap att = node.getAttributes();//获取这个节点的所有属性
Node n1=att.item(i);
n1.getNodeName();拿到属性名
n1.getNodeValue();拿到属性值
Node child = node.getFirstChild();拿到该标签的第一个孩子
String nv = child.getNodeValue();成功获取文本值
创建xml文件:
1.使用DOM方式创建students.xml
原则:就是使用Doc对象去创建各种Node,Attribute和createTextNode(),然后将节点append到相应的标签后面
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.newDocument();//创建新doc对象
主要使用的方法:
Attr name =doc.createAttribute("属性名");
name.setValue("属性值");
标签.setAttributeNode(name);//给标签添加一个Attr对象
标签.setAttribute("属性名","属性值");//给标签设置一个属性 key=value
Element teacher=doc.createElement("标签名");//创建标签 现在只是单单创建了一个标签 没有追加到任何父标签后面
Text hao=doc.createTextNode("文本值");//创建文本 同上
父标签.appendChild(节点);//追加, 将文本或者标签追加到父标签下
将创建的xml写到文件中 需要导入包:crimson.jar
FileWriter fw = new FileWriter("src/teacher.xml");
((XmlDocument)doc).write(fw);
2.使用Writer的方式直接写出去一个xml文件
//1获得写出对象
XMLStreamWriter writer = XMLOutputFactory.newFactory().createXMLStreamWriter(new FileOutputStream("src/aaa.xml"));
常用方法:
writer.writeStartDocument("utf-8", "1.0");//写xml的指令
writer.writeEndDocument();//写结束指令
writer.writeStartElement("students");//写一个开始标签
writer.writeEndElement();//写一个结束标签
writer.writeAttribute("one", "这个是一个单独的子标签");//写一个属性在上面的标签中
writer.writeCharacters("文本 还是很好看的");//写一个文本
删除xml文件的节点:
removeChild()
removeAttribute(String name)