XML编程

XML
* XML的简介
* 可扩展的标记语言。自定义标签。很类似的HTML。
* XML传输数据,HTML是显示数据的。
* 做框架的配置文件。
* 系统与系统传输数据。
* XML1.0 XML1.1

    * XML的语法
        * 文档声明
            * 
            * 出现文档的第一行第一列位置

        * 定义元素
            * 区分大小写     
            * 不能以数字和中划线开头
            * 不能以XML开头
            * 不能包含空格和冒号

        * 定义属性
            * 不能有相同的属性。
            * 规范同上

        * 注释
            * 和HTML的注释一样的

        * 特殊字符
            * <     <
            * >     >
            * &     &
            * "     "
            * '     '

        * CDATA区
            * 把中间的内容作为字符串
            * 写法:
                

        * PI(忘了)

    * XML的约束
        * DTD(会写)       
            * DTD的快速入门
                * 定义元素  
                * 判断哪些是复杂的元素,哪些是简单的元素
                    * 如果简单的元素   (#PCDATA)
                    * 如果是复杂元素   (子元素)
                * 引入到XML的文档中
                    * 可以写在XML的文件上
                        

                    * 引入本地的DTD
                        

                    * 引入网络的DTD
                        


            * DTD的语法
                * 定义元素
                    
                    * 元素类型
                        * (#PCDATA) 字符串
                        * EMPTY     空
                        * ANY       任意的
                        * (子元素)

                    * 子元素
                        * 子元素之间关系
                            * ,     有顺序
                            * |     任选其一
                        * 出现次数
                            * +     1次或多次
                            * *     任意次
                            * ?     0次或1次

                * 定义属性
                    

                    * 属性类型
                        * CDATA     字符串
                        * 枚举        没有关键字(男人|女人)
                        * ID        唯一值

                    * 属性约束
                        * #REQUIRED     必须的
                        * #IMPLIED      可选的
                        * #FIXED        固定值(#FIXED "值")
                        * 默认值

                * 定义实体
                    * 
                    * 在XML引入别名      &别名;
  1. xml编程
  2. JAXP的SAX解析
    * 只能做查询,不能做增删改。
    * SAX解析
    * 解析器
    * 获取解析器的工厂
    * 获取解析器对象
    * 解析XML(XML的文件的地址,事件处理器)

            * 事件处理器
                * 自己编写的类,需要继承DefalutHandler类,重写三个方法。
                * startElement()
                * characters()
                * endElement()
    
    
        * SAX的解析原理:     
            解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,       (边读边解析)
            都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,
            会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。
    
            事件处理器由程序员编写,程序员通过事件处理器中方法的参数,
            就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。
    
  3. 代码实现:
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * SAX的入门
 * @author Administrator
 *
 */
public class JaxpSaxTest {

    public static void main(String[] args) {
        try {
            run1();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取所有的解析的内容
     * @throws Exception 
     * @throws ParserConfigurationException 
     */
    public static void run1() throws Exception{
        // 获取SAX的解析器工厂
        SAXParserFactory factory = SAXParserFactory.newInstance();
        // 获取解析器
        SAXParser parser =  factory.newSAXParser();
        // 解析
        parser.parse("src/book2.xml", new MyHandler2());
    }
}


/**
 * 获取作者标签的文本内容
 *  
 */
class MyHandler2 extends DefaultHandler{
    // 如果解析到作者标签的时候,flag设置成true
    private boolean flag = false;
    private int count = 0;

    /**
     * 默认解析开始标签,默认调用该方法
     */
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        // 如果要是作者标签,flag设置成true
        if("作者".equals(qName)){
            flag = true;
            count++;
        }
    }

    /**
     * 能控制characters的输出,我只在解析作者标签的时候,才打印
     */
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        // 如果flag是true,就打印
        // 每一次都打印
        if(flag && count == 1){
            String str = new String(ch,start,length);
            System.out.println(str);
        }
    }

    /**
     * 
     */
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        // flag恢复成false
        flag = false;
    }
}


/**
 * 自己事件处理器
 * 重写三方法
 * @author Administrator
 *
 */
class MyHandler extends DefaultHandler{

    /**
     * 只要一解析到开始标签的时候,默认调用该方法,把解析的内容赋值给参数。
     */
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        System.out.println("开始标签:"+qName);
    }

    /**
     * 只要解析到文本的内容,默认调用该方法
     */
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        String str = new String(ch,start,length);
        System.out.println(str);
    }

    /**
     * 解析到结束标签的时候,默认调用方法,把解析的内容赋值给参数。
     */
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        System.out.println("结束标签:"+qName);
    }

}




你可能感兴趣的:(java解析xml文件)