首页 > 学院 > 开发设计 > 正文

xml中的schema约束的以及用jaxp通过sax方式解析xml文档和dom4j解析xml文档 ——Web部分第八天

2019-11-14 12:58:08
字体:
来源:转载
供稿:网友

xml中的schema约束的以及用jaxp通过sax方式解析xml文档和dom4j解析xml文档 ——Web部分第八天

1. schema约束

* Scheme约束是分与合xml语法的约束文件,扩展名为.xsd* Scheme约束语义严格,支持多种数据类型的定义。* 但比较dtd更加复杂。

2. 用jaxp通过sax方式解析xml文档

* sax方式:事件驱动,边读取边解析* 使用的类在javax.xml.parsers下* sax解析只能完成查询的操作。* 缺陷:方法是逐行解析,并且连同换行空格的都会解析。注:换行的会被当作文本。//关键代码 ;public class XmlBySax{ public static void main(String[] args) throws Exception { SAXParserFactory saxParserFactory = SAXParserFactory.newInstance() ; SAXParser saxParser = saxParserFactory.newSAXParser() ; saxParser.parse(new File("src/person.xml") , new MyDefaultHandler()); }}//通过创建自己的sax解析类继承DefaultHandler重写其中的三个方法,来实现具体的查询操作。//该类为事件处理器。class MyDefaultHandler extends DefaultHandler { //标签开始时自动执行的方法 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.PRintln( "<"+qName+">" ) ; } //当解析结束标签的时候,自动执行的方法 @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.println( "</"+qName+">" ) ; } //当解析文本时自动执行的方法 @Override public void characters(char[] ch, int start, int length) throws SAXException { String text = new String(ch , start , length).trim() ; if (!text.equals("")) { System.out.print(text); } }}

小知识

* 导包操作 - ecplise下在目录下建立lib文件夹 - 将jar包放到lib下 - 右键jar,build path -- add to buildpath 。* 设置java虚拟机的运行大小

自定义工具包

package com.xml.util;import java.io.FileOutputStream;import java.io.IOException;import org.dom4j.Document;import org.dom4j.io.OutputFormat;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;public class DocumentUtil { public static final String PATH= "src/person.xml" ; public static Document getDocument() { Document document = null ; try { SAXReader saxReader = new SAXReader() ; document = saxReader.read(PATH) ; } catch (Exception e) { e.printStackTrace() ; } return document ; } public static void writerXML(Document document) { XMLWriter xmlWriter = null ; try { xmlWriter = new XMLWriter(new FileOutputStream(PATH) , OutputFormat.createPrettyPrint()) ; xmlWriter.write(document) ; } catch (Exception e) { e.printStackTrace() ; }finally { try { xmlWriter.close() ; } catch (IOException e) { e.printStackTrace(); } } }}

3. dom4j解析xml文档

* dom4j是开源jar包。* dom4j 中 document, element , node , 都是接口。* 回写的类XMLWriter。* dom4j节点的管理实现的是List接口,所以可以按照List接口的方法遍历等操作* 创建新节点的类为DocumentHelper.createElement("") ; 直接创建新节点的方法 父节点.addElement("") ;* OutputFormat为格式化输出,可以设置输出的格式,字符集等等。//代码没有导包。public class XmlByDom4j { public static void main(String[] args) throws Exception { //selectName(); //selectOneName() ; //addElement() ; //writerElement(1); //modifyDocument("90") ; //removeElement() ; getValues() ; } /* * 获取xml标签的属性值 */ private static void getValues(){ Document document = DocumentUtil.getDocument() ; Element p1 = document.getRootElement().element("p1") ; String name = p1.attributeValue("id") ; System.out.println(name) ; } /* * 实现xml中的删除操作 */ private static void removeElement(){ Document document = DocumentUtil.getDocument() ; Element root = document.getRootElement() ; Element p1 = root.element("p1") ; Element school = p1.element("school") ; p1.remove(school) ; DocumentUtil.writerXML(document) ; } /* * 实现xml中的修改操作 */ private static void modifyDocument(String text){ Document document = DocumentUtil.getDocument() ; Element root = document.getRootElement() ; Element p1 = root.element("p1") ; Element age = p1.element("age") ; age.setText(text) ; DocumentUtil.writerXML(document) ; } /* * 指定位置添加 */ private static void writerElement(int index) throws Exception { Element root = new SAXReader().read("src/person.xml").getRootElement() ; Element p1 = root.element("p1") ; List<Element> list = p1.elements() ; Element school = DocumentHelper.createElement("school") ; school.setText("edu.nongda.www") ; list.add(index, school) ; XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/person.xml") , OutputFormat.createPrettyPrint()) ; xmlWriter.write(root) ; xmlWriter.close() ; } /* *实现xml中添加操作,直接在末尾节点添加 */ private static void addElement() throws Exception { Element root = new SAXReader().read("src/person.xml").getRootElement() ; Element p1 = root.element("p1") ; Element sex = p1.addElement("sex") ; sex.addText("nan") ; /*OutputFormat format = OutputFormat.createPrettyPrint() ; //这里可以指定输出的字符集格式字符集 format.setEncoding("utf-8 ") ;*/ XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/person.xml") , OutputFormat.createPrettyPrint()) ; xmlWriter.write(root) ; xmlWriter.close() ; } /* * 得到xml中第一个name的值 */ private static void selectOneName() throws Exception { SAXReader saxReader = new SAXReader() ; Document document = saxReader.read("src/person.xml") ; Element root = document.getRootElement() ; /*List<Element> p1 = root.elements("p1") ; Element p1One = p1.get(0) ; Element name = p1One.element("name") ; System.out.println(name.getText());*/ Element p1 = root.element("p1") ; Element name = p1.element("name") ; System.out.println(name.getName() + ":" + name.getText()) ; } /* * 遍历xml中文件下的内容。 */ private static void selectName() throws DocumentException { // 1.得到dom4j解析器 SAXReader saxReader = new SAXReader() ; Document document = saxReader.read("src/person.xml") ; //得到根节点 Element root = document.getRootElement() ; //得到子节点下的集合 List<Element> p1 = root.elements("p1") ; //遍历集合元素 for(Element element : p1){ //打印输出 Element name = element.element("name") ; System.out.println(name.getText()) ; } }}

4. XPATH的操作

* xpath是dom4j支持的扩展jar包,需要导入jar包。* xpath有很多种形式可以直接提取相应的标签,可以通过API查询* 得到的是Node节点对接点进行操作。* dom4j中有两个方法支持操作selectNodes("xpath格式") ;获取多个节点,selectSingleNode("xpath格式"); 获取单个节点。public class XmlByXpath { public static void main(String[] args) { //forEachElement(); selectId() ; } /* * 使用xpath得到标签 ; */ private static void forEachElement() { Document document = DocumentUtil.getDocument() ; List<Node> list = document.selectNodes("//name") ; for(Node tmp : list){ System.out.println(tmp.getText()) ; } } private static void selectId() { Document document = DocumentUtil.getDocument() ; Node name = document.selectSingleNode("//p1[@id='id1']/name") ; System.out.println(name.getText()) ; }}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表