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();//遍历获取元素内容
}

转载于:https://www.cnblogs.com/zltao/p/10385441.html

.Net转Java自学之路—基础巩固篇二十二(XML)相关推荐

  1. .Net转Java自学之路—基础巩固篇一

    一.基础常用dos命令行: 1.dir:陈列目录下的文件及文件夹 2.md:创建目录 3.rd:删除目录 4.cd:进入制定目录 5.cd..:返回上一级目录 6.cd\:退回跟目录 7.del:删除 ...

  2. .Net转Java自学之路—基础巩固篇二十(Lambda)

    Lambda表达式 语义本身就代表了做事情的动作,没有对象的概念在其中. Java中使用Lambda表达式的前提:必须有 函数式接口. 概念:有且只有一个的抽象方法的接口就叫函数式接口. 为确保当前接 ...

  3. .Net转Java自学之路—基础巩固篇十八(正则)

    正则表达式: 正则就是用于操作字符串的规则.其中是以一些符号来标识规则. 字符类: [] :范围 - :连接符 ^ :非 预定义字符类: . :任何字符 \d :数字 \D :非数字 \s :空白字符 ...

  4. .Net转Java自学之路—基础巩固篇八—总结(封装、继承、多态)

    巴拉巴拉 转载于:https://www.cnblogs.com/zltao/p/9074944.html

  5. Web基础配置篇(十二): Elasticsearch的安装配置及入门使用

    Web基础配置篇(十二): Elasticsearch的安装配置及入门使用 一.概述 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RE ...

  6. .Net转Java自学之路—Spring框架篇二(IOC注解、AOP)

    Spring的Bean操作(注解方式): 注解:代码中特殊的标记,使用注解可以完成相关功能. @注解名称(属性名称=属性值) 注解可以使用在类.方法.属性上面. 主要用途:可以替代配置文件来创建对象和 ...

  7. .Net转Java自学之路—Hibernate框架篇三(查询方式)

    Hibernate查询方式: 1.对象导航查询:根据id查询出一的数据,再根据一的查询结果查询多的数据. OnlyClass only=session.get(OnlyClass.class,1); ...

  8. .Net转Java自学之路—SpringMVC框架篇八(RESTful支持)

    RESTful架构,REST即Representational State Transfer.表现层状态转换,就是目前最流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方便,所以得到越来 ...

  9. 零基础 Java 自学之路(2021年最新版)

    前言 无论你是否想自学 Java,认真看完本文,你以后的职场生涯至少少走1年弯路. 本文会持续更新,建议收藏. 初衷 在 CSDN 上经常有同学私聊我询问 "如何自学 Java". ...

  10. JAVA自学之路 [原创 - 尚学堂科技 - 马士兵老师]

    (我觉得看了之后挺不错的所以分享一下) JAVA自学之路 一:学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3 ...

最新文章

  1. 三维形状和外观重建一次全搞定: DeepSurfels在线融合实现逼真重建
  2. 八皇后算法python_Python学习二(生成器和八皇后算法)
  3. Android消息广播的使用
  4. 【Python教程】30个语言特性技巧整理
  5. concurrenthashmap实现原理_Mybatis:PageHelper分页插件源码及原理剖析
  6. HashMap get不出对象时出错 解决
  7. 这些硬核公众号你知道几个?
  8. 《游戏编程模式》一第7章 状态模式
  9. PostgreSQL ALTER TABLE中改变数据类型时USING的用法转
  10. 树莓派(Raspberry Pi)日期时间不准的修正方法
  11. ORACLE在线切换undo表空间
  12. 看单片机原理图-红外遥控、EEPROM
  13. ​电子投票系统与区块链
  14. Functional Code Clone Detection with Syntax and Semantics Fusion Learning论文总结
  15. 向量代数:向量加法、共线与共面
  16. 解密库尔勒可靠性检测
  17. matlab 更换坐标轴_matlab怎么调整坐标轴范围-Matlab修改坐标轴标注范围的方法 - 河东软件园...
  18. 【ZigBee 系列】| 网关的构成?用 JN51X9 的案例来讲解框架及各部分的功能
  19. 11. Nginx HTTPS
  20. 自己写一个RTOS系统

热门文章

  1. css的list,CSS List 入门教程
  2. 第三届 Apache Flink 极客挑战赛暨 AAIG CUP:Cluster Serving 概况
  3. 刚刚,Google 官方发布了 2 份编程指南,干货十足!
  4. 打砖块游戏代码 c语言,打砖块游戏的源代码(请多指教)
  5. 超级计算机燕 排名,特斯拉超级计算机算力全球第五,展现无人驾驶领域野心...
  6. mysql解压rpm文件在哪_[mysql] mysql 源码安装解压 rpm 包命令
  7. 广义平稳随机过程定义_广义平稳随机过程介绍.ppt
  8. 仓库出租平台有哪些_日用品仓库出租哪家划算周到
  9. 第二周函数-的基本格式:
  10. python怎么制作简单图_Python简单的制作图片验证码实例