zoukankan      html  css  js  c++  java
  • .Net转Java自学之路—基础巩固篇二十二(XML)

    XML

      eXtensible Markup Language 可扩展标记语言。xml 是w3c组织发布的技术。xml 由俩个版本:1.0、1.1 。当前使用的都是1.0版本,因为1.1版本不能向下兼容。

      xml 可以显示数据,但不是主要功能。主要功能是为了存储数据。

      应用:

        1、不同系统之间数据传输。

        2、用来标识生活中有关系的数据。

        3、作为配置文件。

      语法:

        1、xml 的文档声明

          <?xml version="1.0" encoding="dbk"?>

          声明文档必须要写在第一行第一列

          version:版本。

          encoding:编码。

          standalone:是否依赖其他文件 yes/no 。

        2、定义元素(标签)

          <abc></abc>

          <abc />

        3、定义属性

        4、注释

        5、特殊字符

        6、CDATA区

          解决特殊字符频繁转移的操作。

          格式:

            <![CDATA[内容]]>

        7、PI指令(处理指令)

          设置 xml 的样式。

          格式:

            <?xml-stylesheet type="text/css" href="css文档路径"?>

      约束:

        dtd约束、schema约束。

        dtd约束:

          1、创建 .dtd 文件

          2、xml 中由几个元素 dtd 文件中就写几个 <!ELEMENT>

          3、判断元素是否简单元素还是复杂元素

            复杂元素:由子元素的元素

              <!ELEMENT 元素名称(子元素,子元素,子元素...)>

            简单元素:物资元素的元素

              <!ELEMENT 元素名称(#PCDATA)>

          4、在 xml 文件中引入 dtd 文件

            <!DOCTYPE 根元素名称 SYSTEM "dtd 文件路径">

          5、dtd 的引入方式

            a、引入外部的 dtd 文件

              <!DOCTYPE 根元素名称 SYSTEM "dtd 文件路径">

            b、使用内部 dtd 文件

              直接在内部书写 dtd 文件内容

              <!DOCTYPE 根元素名称[

                <!ELEMENT 元素名称(子元素,子元素,子元素...)>

                <!ELEMENT 元素名称(#PCDATA)>

              ]>

            c、使用外部(网络上)的 dtd 文件

              <!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">

              struts2 跨甲的配置文件使用外部 dtd 文件方式。

          6、使用 dtd 定义元素

            格式:

              <!ELEMENT 元素名 约束>

            简单元素约束:

              <!ELEMENT 元素名称(#PCDATA)/EMPTY/ANY>

              (#PCDATA):约束元素为字符串类型

              EMPTY:元素为空(没有内容)

              ANY:任意

            复杂元素约束:

              <!ELEMENT 元素名称(子元素,子元素,子元素...)>

                当前这种写法子元素只能出现一次

              表示子元素出现的次数:

                +:表示子元素可以出现一次或多次。

                ?:表示子元素可以出现0次或一次。

                *:表示子元素可以出现0次或多次。

              子元素直接使用逗号","隔开表示:子元素出现的顺序

              子元素直接使用"|"隔开表示:元素只能出现定义范围内的任意一个

          7、使用 dtd 定义属性:

            格式:

              <!ELEMENT 元素名称 (#PCDATA)/EMPTY/ANY>

              <!ATTLIST 元素名称

                元素名称 属性类型 属性约束

                ...

              >

            属性类型:

              CDATA:字符串。

              枚举:只能在一定范围内出现值,但只能每次出现其中一个。

                格式:(aa|bb|cc)

              ID:值只能是字母/下划线开头。

            属性约束:

              #REQUIRED:属性必须存在

              #IMPLIED:属性可有可无

              #FIXED:一个固定值。

                格式:属性名 属性类型 #FIXED "值"

                属性值必须是设置的这个值

              直接值:

                格式:属性名 属性类型 “值”

                若在元素中不存在该属性,则直接使用该设置的值

                若在元素中存在该属性,则使用该属性中的值

          8、dtd 实体的定义

            格式:

              <!ENTITY 实体名称 "实体的值">

            在元素中使用实体,可以直接获取到实体的值

              格式:@实体名称;

            注:定义实体需要写在内部的 dtd 中,若写在外部的 dtd 中,在某些浏览器下内容会获取不到。

        schema约束:

          schema 符合 xml 语法,xml 语句。

          一个 xml 中只能由一个 dtd,但可以由多个 schema,多个 schema 使用命名空间来区分(类似与Java包名)。dtd中由PCDATA类型,但 schema 中可以支持更多的数据类型。由此可见 schema 约束更加严格,但 schema 语法更加复杂。

          schema 文件自身就是一个 xml 文件。但后缀名:.xsd 。跟节点:<schema> 在<schema> 文件中由w3c提供的属性和标签,来约束 xml 文件。

          <schema> 根元素中有一些属性:

            xmlns="http://www.w3.org/2001/XMLSchema" :表示当前 xml 文件是一个约束文件

            targetNamespace="url":使用 schema 约束文件,直接通过这个地址引入约束文件

            enementFormDefault="qualified":质量良好

          复杂元素:

            <complexType>

              <sequence>

                子元素

              </sequence>

            </complexType>

          简单元素:写在复杂元素的<sequence>下

            <element name="父元素">

              <complexType>

                <sequence>

                  <element name="元素" type="类型"></element>

                </sequence>

              </complexType>

            </element>

          被约束文件引入约束文件

            在 xml 文件的根元素中写入属性

              xmlns:xsi="schema文件的xmlns的url-instance":表示 xml 是一个被约束文件

              xmlsn="schema文件的targetNamespace的url":是约束文档中的targetNmaespace

              xsi:schemaLocation="schema文件的targetNamespace的url schema文件路径.xsd"  targetNamespace "空格" 约束文档的地址路径

          complexType下的元素:

            sequence:子元素出现的顺序
            all:子元素只能出现一次
            choice:子元素只能出现其中的一个
            maxOccurs="unbounded":元素出现的次数;unbounded次数不限制
              例:<element name="元素" type="类型" maxOccurs="unbounded"></element>
            any:任意元素

          复杂元素下定义的约束属性:
            在</complexType>之前定义 <attribute name="属性名称" type="属性类型" use="required"></sttribute>
              use:属性是否必须出现。required:必须出现
          名称空间:
            xml文件引入多个schema约束文件时,需要在xmlns后跟别名
              例:xmlns:别名="url"
            若使用别名所指向的约束文件,在定义元素时需要:
              <别名:元素></别名:元素>

      XML解析:

        xml 是标记型文档。

        js 使用 dom 解析标记型文档:根据html的层级结构,在内存中分配一个属性结构,把html的标签、属性和文本都封装成对象。document对象、element对象、属性对象、文本对象、Node节点对象。

        XML的解析方式:dom 与 sax

          dom解析:

            根据xml的层级结构,在内存中分配一个树形结构;把xml中每部分都封装成对象。

            缺点:使用dom方式解析xml时,若xml文件过大,会造成内存溢出。

            优点:方便实现增、删、改操作。

          sax解析:

            采集时间驱动,边读边解析。从上到下,一行一行的解析,解析到某个对象,把对象名称返回。

            优点:使用sax方式不会造成内存溢出,方便实现查询。

            缺点:不能实现增、删、改操作。

          解析器 XML解析开发包:

            sum公司提供了针对dom、sax的解析器:jaxp

            dom4j组织提供了针对dom、sax的解析器:dom4j

            jdom组织提供了针对dom、sax的解析器:jdom

            1、jaxp:

              jaxp是JavaSE的一部分。在 jdk 的 javax.xml.parsers 包中存在四个分别针对dom和sax解析使用的类。

              dom:

                DocumentBuilder:解析类。该类为抽象类,不能new,但可以从DocumentBuilderFactory.newDocumentBuilder()获取实例;用Document parse("xml-path")解析xml,返回的document是一个接口,父节点是Node,若在document中找不到理想的方法,则在Node中查找。

                DocumentBuilderFactory:解析器工厂。该类为抽象类,不能new,可以从newInstance()获取DocumentBuilderFactory的实例。

              sax:

                SAXParser:解析器类。该类为抽象类,不能new,但实例可以从SAXParserFactory.newSAXParser()来获取;用parse(File f,DefaultHander dh)解析xml。第一个参数 File f:xml路径。第二个参数DefaultHander dh:事件处理器。

                SAXParserFactory:解析器工厂。该类为抽象类,不能new,但实例可以从newInstance()来获取。

    实例:jaxp的dom方式操作xml文件

    //创建解析工厂
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    //创建解析器
    DocumentBuilder bd = dbf.newDocumentBuilder();
    //解析xml文件
    Document document = bd.parse("xmlpath");
    
    //获取元素
    NodeList nodelist=document.getElementsByTagName("元素");
    for(int i=0;i>nodelist.getLength();i++){
        Node node=nodelist.item(i)//获取每一个元素
        String str=node.getTextContent();//获取元素的内容
    }
    //获取第几个元素/值
    Node node=nodelist.item(int);
    String str=node.getTextContent();
    
    //jaxp使用dom添加节点
    NodeList nodelist=document.getElementsByTagName("元素");
    Node node=nodelist.item(int);
    Element ele=document.createElement("new元素");
    Text text=document.createTextNode("内容");
    ele.appendChild(text);
    node.appendChild(ele);
    //回写xml
    TransformerFactory tf=TransformerFactory.newInstance();
    Transformer transformer=tf.newTransformer();
    transformer.transform(new DOMSource(document),new StreamResult("xmlpath");
    
    //jaxp使用dom修改节点
    NodeList nodelist=document.getElementsByTagName("元素");
    Node node=nodelist.item(int);
    node.setTextContent("修改的内容");
    //回写xml
    TransformerFactory tf=TransformerFactory.newInstance();
    Transformer transformer=tf.newTransformer();
    transformer.transform(new DOMSource(document),new StreamResult("xmlpath");
    
    //jaxp使用dom删除节点
    NodeList nodelist=document.getElementsByTagName("元素");
    Node node=nodelist.item(int);
    Node nodeDelete=node.getParentNode();
    nodeDelete.removeChild(node);
    //回写xml
    TransformerFactory tf=TransformerFactory.newInstance();
    Transformer transformer=tf.newTransformer();
    transformer.transform(new DOMSource(document),new StreamResult("xmlpath");
    
    /*jaxp使用dom遍历节点 
    * 递归遍历 
    */Node为Document的父类  故使用node.getChildNodes();
    String strNode="";
    strNode=NodeListDocument(document,strNode);
    
    public String NodeListDocument(Node node,String nodes){
        if(node.getNodeType()==Node.ELEMENT_NODE){
            nodes+=node.getNodeName();
        }
        NodeList nodelist=document.getChildNodes();
        for(int i=0;i<nodelist.getLength();i++){
            Node nd=nodelist.item(i);
            NodeListDocument(nd,nodes);
        }
        return nodes;
    }
    View Code

    实例:jaxp的sax方式操作xml文件

    SAXParserFactory saxpf=SAXParserFactory.newInstance();
    SAXParser saxp=saxpf.newSAXParser();
    saxp.parse("xmlpath",new DHandler());
    
    
    Class DHandler extends DefaultHandler{
        public void startElement(String url,String localName,String qName,Attributes attributes) throws SAXException{
            //Code...
        }
        
        public void characters(char[] ch,int start,int length)throws SAXException{
            //Code...
        }
        
        public void endElement(String url,String localName,String qName)throws SAXException{
            //Code...
        }
    }
    View Code

            dom4j:

              使用 dom4j 需要导入 dom4j 提供的 jar 包。

              获取Document:

    SAXReader saxr=new SAXReader();
    Document document=saxr.read("xmlpath");

              Document接口的父接口为Node;Document中的方法不满足的情况下,可以使用Node中的方法。Document中的getRootElement()获取根节点,返回Element。

              Element也是一个接口,父接口同为Node。

              Element 和 Node 中的方法:

                getParent(); 获取父节点。

                addElement(); 添加标签。

                element(str); 获取该标签下的第一个子标签。

                List<Element> elements(str); 获取该标签下的一层的所有子标签。

                element(); 获取标签下的所有一层子标签。

                getText(); 获取元素的内容。

                setText(); 添加元素内容。

                remove(Element); 删除节点

    实例:使用dom4j查询xml

    SAXReader saxr=new SAXReader();
    Document document=sexr.read("xmlpath");
    Element root=document.getRootElement();
    
    Element elefirst=root.element("元素");
    //...
    String str=elefirst.getText();
    
    List<Element> list=root.elements("元素");
    Element ele=list.get(int);
    Element element = ele.element("元素");
    //...
    String str=element.getText();

    实例:使用dom4j添加操作

    SAXReader saxr=new SAXReader();
    Document document=sexr.read("xmlpath");
    Element root=document.getRootElement();
    
    Element ele=root.element("元素");
    Element addEle=ele.addElement("元素");
    addEle.setText("内容");
    
    /*
    * 回写xml
    * 格式化OutputFormat类下有俩个static方法
    *    createPrettyPrint() 缩进(格式化)效果
    *    createCompactFormat() 压缩效果
    */
    XMLWriter xmlw=new XMLWriter(new FileOutputString("xmlpath"),OutputFormat.createPrettyPrint());
    xmlw.write(document);
    xmlw.close();
    
    
    //在特定位置添加元素
    SAXReader saxr=new SAXReader();
    Document document=sexr.read("xmlpath");
    Element root=document.getRootElement();
    
    Element ele=root.element("元素");
    List<Element> list=ele.elements();
    //创建元素 DocumentHelper帮助类创建标签
    Element news=DocumentHelper.createElement("new元素");
    news.setText("内容");
    list.add(int,news);//在指定下标位置添加
    
    //回写xml
    XMLWriter xmlw=new XMLWriter(new FileOutputString("xmlpath"),OutputFormat.createPrettyPrint());
    xmlw.write(document);
    xmlw.close();

    实例:使用dom4j修改操作

    SAXReader saxr=new SAXReader();
    Document document=sexr.read("xmlpath");
    Element root=document.getRootElement();
    
    Element ele=root.element("元素");
    Element temp=ele.element("元素");
    temp.setText("修改内容");
    
    //回写xml
    XMLWriter xmlw=new XMLWriter(new FileOutputString("xmlpath"),OutputFormat.createPrettyPrint());
    xmlw.write(document);
    xmlw.close();

    实例:使用dom4j删除节点操作

    SAXReader saxr=new SAXReader();
    Document document=sexr.read("xmlpath");
    Element root=document.getRootElement();
    
    Element ele=root.element("元素");
    Element temp=ele.element("元素");
    ele.remove(temp);
    
    //回写xml
    XMLWriter xmlw=new XMLWriter(new FileOutputString("xmlpath"),OutputFormat.createPrettyPrint());
    xmlw.write(document);
    xmlw.close();

    实例:使用dom4j获取属性值操作

    SAXReader saxr=new SAXReader();
    Document document=sexr.read("xmlpath");
    Element root=document.getRootElement();
    
    Element ele=root.element("元素");
    String strValue = ele.attributeValue("属性名称");

      XPath:

        dom4j 支持XPath的操作:可以直接获取到某个元素。

        表现形式:

          第一种:/AAA/BBB/CCC:表示一层一层的;AAA下面BBB下面的CCC。

          第二种://BBB:表示和这个名称相同;只要名称为BBB都获取。

          第三种:/*:所有元素。

          第四种:BBB[1]:表示第一个BBB元素;BBB[last()]:表示最后一个BBB元素。

          第五种://BBB[@id]:只要BBB元素中存在id属性,都获取。

          第六种://BBB[@id='b']:元素名称是BBB,属性为 id='b' 的都获取。

        具体操作:

          默认的情况下,dom4j不支持XPath,若想要在dom4j中有XPath,需要引用XPath的 jar 包。

          在dom4j中提供了俩种方法,用来支持XPath:

            1、selectNodes("XPath表达式");获取多个节点

            2、selectSingleNode("XPath表达式");获取一个节点

    实例:XPath实现 查询

    SAXReader saxr=new SAXReader();
    Document document=saxr.read("xmlPath");
    List<Node> list=document.selectNodes("//元素");
    for(Node node:list){
        String str=node.getText();//遍历获取元素内容
    }
  • 相关阅读:
    Docker部署Mysql实践
    Docker部署Zookeeper部署集群实践(2)
    Docker部署Zookeeper部署实践(1)
    Docker部署Jenkins 2.285版持续部署集成实践(1)
    Ubuntu18.04安装docker
    Git的配置
    C语言的一些小知识
    线段树模板整理
    关于Kmp
    HDU-2063(二分图匹配模板题)
  • 原文地址:https://www.cnblogs.com/zltao/p/10385441.html
Copyright © 2011-2022 走看看