• java 之 schema解析


    一,schema约束
        *dtd语法:<ELEMENT 元素名  约束>
        *schema符合xml的语法,xml语句
        **一个xml中可以有多个schema,多个schema使用名称空间区分(类似java包名)
        **dtd里面有PCDATA类型,但是在schema类面可以支持更多数据类型
        **schema更加复杂,不能替代dtd
        (1)schema快速入门
    *w3c提供了属性和标签给schema
    *在schema文件里面,以<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.itcast.cn/20151111" elementFormDefault="qualified"></schema>开头 **xmlns:表示当前xml文件是一个约束文件
    **targetNamespace:可以通过这个地址引入约束文件
    *schema里面有多少元素就有多少个element
    例如必须含有:<element name="person"></element name="age"><element name="name"></element>
    *复杂元素:案例
    <element name="person"><complexType><sequence><element name="name" type="string"></element><element name="age" type="int"></element></sequence></complexType></element>
    *引入约束文件:
    *案例:<person xmlns:xsi="schema中xmlns属性-instance" xmlns="targetNamespace属性" xsi:schemaLocation="targetNamespace 空格 schema文档路径"></person>
    其中xsi这个是随意取的名,也可以是xss......
    <sequence></sequence>:元素出现的顺序
    <all></all>:元素只能出现一次
    <choice></choice>:只能有其中过一个出现
    <element name="age" type="int" maxOccurs="unbounded"></element>"表示元素出现的次数,此处是无限次
    <any></any>:表示任意元素
    *定义属性:
    <attribute name="id1" type="int" use="required">: 表示所有的元素必须有id1的属性
    name:属性名称
    type:属性类型
    use:是否必须出现
    (2)sax解析的原理
    *解析xml有两种技术 dom和sax
    *根据xml的层级结构在内存中分配一个树形结构
    *把xml中标签,属性,文本封装成对象
    *sax:事件驱动,边读边解析
    *SAXParser
    此类的实例可以从SAXParseFactory.newSAXParser();方法获得
    parse(File f,DefaultHandler dh);f:xml路径 dh:事件处理器
    *SAXParserFactory




    -----------------------打印所有信息-----------------------
    public class TestJaxp {
        public static <DocumentBuildFactory> void main(String[] args) throws Exception
        {
            
            //创建解析工厂
            SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
            //创建解析器
            SAXParser saxParser=saxParserFactory.newSAXParser();
            //执行parser方法
            saxParser.parse("src/NewFile.xml", new MyDefault());
        }
    }
    
    class MyDefault extends DefaultHandler
    {
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            // TODO Auto-generated method stub
            System.out.print("<"+qName+">");
        }
    
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            // TODO Auto-generated method stub
            System.out.print("<"+qName+">");
        }
    
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            // TODO Auto-generated method stub
            System.out.print(new String(ch,start,length));
        }
    ----------------得到某个元素的值-------------------
    public class TestJaxp {
        public static <DocumentBuildFactory> void main(String[] args) throws Exception
        {
            
            //创建解析工厂
            SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
            //创建解析器
            SAXParser saxParser=saxParserFactory.newSAXParser();
            //执行parser方法
            saxParser.parse("src/NewFile.xml", new MyDefault());
        }
    }
    
    class MyDefault extends DefaultHandler
    {
        boolean flag=false;
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            // TODO Auto-generated method stub
            if("TIME".equals(qName))
            {
                flag=true;
                //System.out.print("<"+qName+">");
            }
        }
    
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            // TODO Auto-generated method stub
            if("TIME".equals(qName))
            {
                flag=false;
                //System.out.print("<"+qName+">");
            }
            
        }
    
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            // TODO Auto-generated method stub
            if(flag==true)
            {
                System.out.print(new String(ch,start,length));    
            }
            
        }
    }
    ----------------------取第一个元素----------------------
    public
    class TestJaxp { public static <DocumentBuildFactory> void main(String[] args) throws Exception { //创建解析工厂 SAXParserFactory saxParserFactory=SAXParserFactory.newInstance(); //创建解析器 SAXParser saxParser=saxParserFactory.newSAXParser(); //执行parser方法 saxParser.parse("src/NewFile.xml", new MyDefault()); } } class MyDefault extends DefaultHandler { boolean flag=false; int idx=1; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // TODO Auto-generated method stub if("TIME".equals(qName)) { flag=true; //System.out.print("<"+qName+">"); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub if("TIME".equals(qName)) { flag=false; //System.out.print("<"+qName+">"); idx++; } } @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub if(flag==true && idx==1) { System.out.print(new String(ch,start,length)); } } }

       

  • 相关阅读:
    五种IO模型透彻分析
    linux正则表达式
    洛谷P1242 新汉诺塔 【神奇的递归】
    【NOIP2012】疫情控制
    [ZJOI2007]棋盘制作 【最大同色矩形】
    [NOIP2008]双栈排序 【二分图 + 模拟】
    LCA的倍增算法
    最大权闭合子图
    小Z的袜子 题解报告【莫队】
    ZJOI2012网络 题解报告【LCT】
  • 原文地址:https://www.cnblogs.com/zmztya/p/8552856.html
Copyright © 2020-2023  润新知