当前位置: 首页 > 编程日记 > 正文

XML 解析XML文档 XML约束

XML

什么是XML

  1. Extensible Markup Language(可扩展的标记语言)
  2. 他是一个语言,有自己的语法,和Java以及其他的编程无关
  3. “标记” 在文件中包含类似于张三 ,这种用尖括号括起来的叫标记,使用来标记数据的。标记可以嵌套,有包含、所属关系。XML是纯文本文档,它是由“标记+数据”组成
  4. 例如:

    1. 建立文件:clases.xml

      <类库>

      <属性></ 属性>
      

      < /类库>

XML 的作用

  1. 存储数据【以后数据库存储文件】

  1. 做配置文件【重点应用方式】

XML的语法

1、文档声明

  1. 一个格式化好的XML文档,应该有一个“文档声明”,不是必须有
  2. 文档声明格式:

2、XML的语法_元素(标签)

  1. 元素:也叫标记、标签。
  2. 标签分类

    1. 完整标签:有开始标签,和结束标签

      <name>张三</name>

    2. 单标签:只有开始标签,没有结束标签;单标签可以通过属性来记录数据

      <property name="id" value="it001"/>

  3. 标签的语法

    1. 标签名称可以包含大部分的字符,包括中文
    2. 标签里可以包括以下的符号:“、 _ - . ”
    3. 但只能以字母、下划线、冒号开头
    4. 标签的内容:

      1. 可以是“数据”
        <name>张三</name>
      2. 可以是子标签

    5. 区分大小写

3、属性:唯一的

  1. 一个标签中可以定义任意多个的“属性”,属性的作用:存储数据。
  2. 语法规则

    1. 一个标签可以定义0或者多个属性,属性名不能重名,用空格隔开
    2. 属性的格式:属性名=“属性值”属性值必须要用单引号或者双引号括起来
      (认为单引号或者双引号里的内容是数值)

    3. 属性,必须定义在开始标签中。

4、注释

5、转义字符

如果数据中包含大量的转义字符,编写时可读性不好。可以使用CDATA区来标志数据。

6、解析XML文档 两种方式

  1. DOM解析:一次性将整个文档读取到内存中,会将内部的各种标签已经属性、数据等信息全部封装到一个对象中。最终形成DOM对象,在DOM对象内容保留文档的结构信息。优点:内存中保留文档的结构进行修改(增加、修改、删除元素等修改)。缺点:如果文档很大,会占用内存。
  2. SAX解析:一次读取,解析一行,读取下一行,之前的信息会被丢掉。优点:速度快,缺点:没有文档结构,不能进行节点的增删改查。
  3. PULL解析:用于Android系统内容不的解析方式。类型于SAX。

7、解析器

  1. JAXP
  2. JDom
  3. Jsoup
  4. dom4j:第三方开发包,内部结合了DOM和SAX解析的方式

8、解析原理 是一个创建树的过程

XML文档读取到内存的过程:先创建一个DOM对象(Document);在创建一个节点Element(根元素)对象;创建子元素Element(节点)对象在根元素下面;创建属性(Attribute)对象在子节点对象下面;值(一般是String)对象在属性对象下面;

Document|--根元素【Element】|--子元素|--属性对象【Attribute】|--值对象|--子元素对象(Element)|--值对象|--子元素对象

9、XML文档读取步骤

准备工作:引入第三方工具包Dom4j.jar

  1. 创建SAXReader对象
  2. 对象对去XML文档,生成DOM树
  3. 获取根元素
  4. 获取到根元素后,利用它获得其他的子元素还有它自己在的属性(Attribute)

常用的方法:

1.public String getName():获取当前Element对象的”标签名”;

2.public List elements():获取当前Element对象下的所有子元素;

3.public List elements(String eleName):获取当前Element对象下的所有 eleName的子元素;

4.public String getText():获取当前Element对象的数据内容;

5.public String elementText(String eleName):获取当前Element对象的”eleName子元素的数据内容”;

代码练习

demo.xml

   <?xml version="1.0" encoding="UTF-8"?>
<students><student id = "it001"><name>章子怡</name><age>18</age><sex>女</sex></student><student id = "it002"><name>汪峰</name><age>19</age><sex>男</sex></student><student id = "it003"><name>撒贝宁</name><age>20</age><sex>男</sex></student><teacher id="001" name="teacher"><name>春春</name><age>56</age><sex>女</sex></teacher><teacher></teacher>
</students>

MyVisitor.java

import org.dom4j.Attribute;
import org.dom4j.Element;
import org.dom4j.VisitorSupport;public class MyVisitor extends VisitorSupport {//获取标签的对象的名字@Override public void visit(Element e) {System.out.println(e.getName());}//获取标签属性的名字@Overridepublic void visit(Attribute a) {System.out.println(a.getName());}
}

测试类 demo01.java
import java.io.File;
import java.util.Iterator;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;/*** 解析demo.xml文档* * @author YandeHu**/
public class Demo01 {private static final String Element = null;public static void main(String[] args) throws Exception {// 创建SAXreader对象SAXReader reader = new SAXReader();// 读取demo.xml文档 返回一个文档对象Document dom = reader.read(new File("demo.xml"));// 读取XML文档的根节点Element root = dom.getRootElement();// 获得根节点的名称String rootName = root.getName();System.out.println(rootName);// 利用根节点获得下面的子节点/*** 遍历子节点的两种方式*/// 迭代器遍历子节点Iterator elr = root.elementIterator();// 遍历所有的子节点还可以遍历while (elr.hasNext()) {Element e = (Element) elr.next();String id = e.attributeValue("id");// 获取标签的属性值System.out.println("id=" + id);String age = e.elementText("age");// 获取标签<age>里的内容System.out.println("age=" + age);System.out.println(e.getName());// 获取节点的名字// System.out.println(e.getStringValue());//获取标签标记的数据System.out.println(e.getText());}/*** Visitor 是 GOF 设计模式之一。其主要原理就 是两种类互相保有对方的引用,并且一种作为 Visitor 去访问许多* Visitable。*/System.out.println("=========Visitor==============");root.accept(new MyVisitor());}
}

10、XML约束

  1. DTD:对一些简单的XML文件进行约束
  2. Schema:对一些比较复杂的XML文档进行更加细致、广泛的约束。

XML约束可以约束:

  • 根元素下都可以出现哪些子元素
  • 元素出现的顺序、次数
  • 元素包含的属性
  • 元素中包含哪些子元素或者数据

DTD约束条件的引入

  1. 内部引入
  2. 引入外部(本地)

  3. 引入外部(网络)

Schema约束条件的引入

schema文档结构说明

练习:读取XML文件获取类的信息,利用反射创建对象

代码

student.xml

<?xml version="1.0" encoding="UTF-8"?>
<classes><class className="com.day16.text.Student"><name>张三</name><age>18</age></class>
</classes>

Student类

public class Student {private String name;private int age;public Student() {super();}public Student(String name, int age) {super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + "]";}}

RefiectDemo类 测试类

import java.io.File;
import java.lang.reflect.Constructor;
import java.util.Iterator;import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;public class ReflectDemo {public static void main(String[] args) throws Exception {//编写方法 获取XML文档classname内容的方法 String s=getDom(new File("student.xml"));//利用反射创建实例Class<?> c = Class.forName(s);//获取类的构造方法Constructor<?> con = c.getConstructor(String.class,int.class);Object stu = con.newInstance("小明",23);System.out.println(stu);}public static String getDom(File file) throws Exception{//创建SAXreader对象SAXReader reader=new SAXReader();//读取XML文档Document dom = reader.read(file);//获取根节点Element root = dom.getRootElement();String value=null;//遍历根节点Iterator list = root.elementIterator();while(list.hasNext()){Element element = (Element) list.next();//获取<class>标签的属性值Attribute classname= element.attribute("className");value= classname.getValue();}return value;}
}

2017/11/1 17:32:39

相关文章:

Host Only、NAT和Bridge三种网络连接

Host Only、NAT和Bridge三种网络连接 在安装好了Linux镜像之后&#xff0c;如何连接物理机和虚拟机呢&#xff1f;这就需要网络连接&#xff0c;网络连接有三种&#xff1a;HostOnly、NAT、Bridge&#xff0c;它们都可用于Guest虚拟机和Host物理机之间的网络通信。 一、三者的不…

OSPF 提升 一 ----基础

ospf ccnp内容 一 link-state protocols IGP 开放式的最短路径优先协议 公有协议支持中到大型的网络 spf算法 链路状态协议1.传送的LSA link status advertisement 链路状态通告 包换拓扑信息具体包括&#xff1a;网段的前缀 掩码 连接的路由器的…

C#实现网页截图功能

//需要添加System.Drawing及System.Windows.Forms引用 using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Windows.Forms; namespace 网页截图 { class Program { [S…

微软发布全新多核心操作系统原型:Barrelfish

Windows 7完成之后&#xff0c;很多人开始把目光投向微软的下一代服务器和客户端操作系统Windows 8&#xff0c;不过今天微软放出了一套全新操作系统的原型&#xff0c;开发代号“Barrelfish”。该系统由微软剑桥研究院和苏黎世理工学院联合全新开发&#xff0c;专为现在和未来…

Docker应用:Kubernetes(容器集群)

Docker应用&#xff1a;Kubernetes&#xff08;容器集群&#xff09; 原文:Docker应用&#xff1a;Kubernetes&#xff08;容器集群&#xff09;阅读目录&#xff1a; Docker应用&#xff1a;Hello WorldDocker应用&#xff1a;Docker-compose&#xff08;容器编排&#xff09;…

通道应用——抠头发

通道应用——抠头发 原图&#xff1a; 效果图&#xff1a; 步骤&#xff1a;1、打开原图的“通道面板”&#xff0c;选择颜色对比分明的绿色通道&#xff0c;并新建一个绿色通道副本&#xff1b;2、选择“图像”-“调整”-“色阶”&#xff0c;调节色阶使得头发颜色更分明些&am…

2017 ACM/ICPC 南宁赛区小结 By JSB @ Reconquista

Statistics TYPE: Onsite ContestNAME: 2017 - ICPC - Asia NanningPLAT: pc^2TIME: 2017/11/26 09:00-14:00LOCA: Guangxi UniversityTEAM: Reconquista[shb,lsmll,jsb]RANK: 8/227 3.52%SOLVE: 8/13PENALTY: 451 ◦ A - 1 ◦ E - 123 (2) ◦ F - 8 ◦ H - 55 ◦ I - 97 (1) ◦…

用户管理系统控制台版连接数据库

建User表 CREATE TABLE user (id INT(11) NOT NULL AUTO_INCREMENT,name VARCHAR(20) DEFAULT NULL,pwd VARCHAR(20) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEINNODB AUTO_INCREMENT5 DEFAULT CHARSETutf8User对象&#xff08;javaBean&#xff09; public class User {priva…

微信小程序组件 日历

js文件 use strict;let choose_year null,choose_month null;const conf {data: {hasEmptyGrid: false,showPicker: false},onLoad() {const date new Date();const cur_year date.getFullYear();const cur_month date.getMonth() 1;const weeks_ch [ 日, 一, 二, 三, …

node编写定时任务,for循环只执行一遍的解决办法

在用node编写定时任务时候&#xff0c;发现for循环只执行i0这一次&#xff0c;就不接着循环执行了&#xff0c;下面贴上代码&#xff1a; exports.task async function(ctx){ let { app } ctx, resultArr1 [],//查询的数据库数据 resultArr2 [];//查询的数据库…

oledb读不到dbf文件内容

最近在处理一批VFP的数据库&#xff0c;使用OleDB方式读取一直很正常&#xff0c;前两天突然碰到一张表怎么也读不出数据来&#xff0c;害我瞎忙了一整天&#xff0c;在研究了DBF文件结构后发现记录前的0x20位置存储的是0x2A。 一查才知道是删除标记&#xff0c;我倒&#xff0…

好用的截图工具

好用的截图工具...简单好用而且不大转载于:https://blog.51cto.com/dd123/208983

“AS3.0高级动画编程”学习:第二章转向行为(上)

因为这一章的内容基本上都是涉及向量的&#xff0c;先来一个2D向量类&#xff1a;Vector2D.as (再次强烈建议不熟悉向量运算的童鞋&#xff0c;先回去恶补一下高等数学-07章空间解释几何与向量代数.pdf) package {import flash.display.Graphics;public class Vector2D {privat…

用Azure VM + Azure Database for MySQL搭建Web服务

仍然是一篇动手实验&#xff0c;实验演示如何在Azure的虚拟机内部署一个Web服务器&#xff0c;并且使用Azure Mysql PaaS作为本应用的数据库。此实验的目的一方面是为了演示Azure IaaS层和PaaS服务配合使用的常规操作&#xff0c;另一方面是为之后的文章打基础&#xff0c;后续…

C3P0_and_pro.properties配置文档代码

C3P0-config.xml配置文件 <c3p0-config> <!-- 默认配置&#xff0c;如果没有指定则使用这个配置 --> <default-config><property name"driverClass">com.mysql.jdbc.Driver</property><property name"jdbcUrl">jdbc:…

电视信号——行场同步

电视信号分NTSC制和PAL制两种制式, NTSC制每秒刷新60次, 而PAL制每秒刷新50次。 水平消隐&#xff1a;电子枪从左到右画出象素&#xff0c;它每次只能画一条扫描线&#xff0c;画下一条之前要先回到左边并做好画下一条扫描线的准备&#xff0c;这之间有一段时间叫做水平消隐&am…

QWidget一生,从创建到销毁事件流

版权声明&#xff1a;若无来源注明&#xff0c;Techie亮博客文章均为原创。 转载请以链接形式标明本文标题和地址&#xff1a;本文标题&#xff1a;QWidget一生&#xff0c;从创建到销毁事件流 本文地址&#xff1a;http://techieliang.com/2017/11/319/ 代码较多&#xff…

事物_软件分层

事务 事务是&#xff1a;在数据库指业务处理的”一个业务“对应数据库中的多个步骤的操作。例如银行转账。 面对的问题&#xff1a;程序接受请求后&#xff0c;会至少发送两条SQL语句&#xff0c;两条语句之间会有时间的间隔&#xff0c;如果间隔时间期间Mysql服务器发生意外&a…

雷林鹏分享:jQuery EasyUI 数据网格 - 创建属性网格

jQuery EasyUI 数据网格 - 创建属性网格 属性网格(property grid)带有一个内置的 expand(展开)/collapse(合并) 按钮&#xff0c;可以简单地为行分组。您可以简单地创建一个可编辑属性的分层(hierarchical)列表。 设置 HTML url"propertygrid_data.json" showGroup&q…

as3.0中如何阻止事件冒泡?

as3.0中的事件冒泡机制有时候会很烦人&#xff0c;比如一个Sprite(方便下文描述就命名为Container吧)把另一外Sprite(称为Child吧)做为子元素套进来以后&#xff0c;如果两个Sprite都注册了Mouse_Down事件&#xff0c;要想在Child上点击鼠标时系统只响应Child的Mouse_Down事件&…

紫色回归线:雅虎中国的运筹学

共同体并不意味着一个我们可以获得享受的世界&#xff0c;而是一个我们热切希望栖息、希望重新拥有的世界。—— 齐格蒙特.鲍曼紫色回归线&#xff1a;雅虎中国的运筹学紫色是比较中性的颜色&#xff0c;但紫色在生活中却也是温柔、神秘、甚至性感的代词。当雅虎中国将主色调重…

JavaScript_上

javaScript JavaScript,简称JS&#xff0c;是Web开发中不可缺少的脚本语言的&#xff0c;不需要编译就可以运行&#xff08;解释性语言&#xff09;。它“寄生”在HTML体内&#xff0c;随网络传输到客户端在浏览器中运行。js代码可以写到html的任何地方。一般写在 body 结束标签…

java类加载的表现形式

java中的类是动态加载的&#xff0c;我们先看一下我们常用的类加载方式&#xff0c;先有一个感性的认识&#xff0c;才能进一步 深入讨论,类加载无非就是下面三种方式。 class A{} class B{} class C{} public class Loader{ public static void main(String[] args) throws Ex…

.net core在vs开发环境下脱离iis运行

.net core相比之前.net的是一个可以跨平台&#xff0c;脱离iis运行的语言&#xff0c;并且项目启动的效率要比用iis启动快&#xff0c;可以说进一步提高了开发的效率。要想自己的项目core脱离iis&#xff0c;首先选择vs启动项目的载体&#xff1a; 如下图&#xff0c;不要选择I…

Sublime遇见中文乱码问题?

今天在写demo的时候&#xff0c;突然发现html页面上的中文在浏览器上显示乱码~&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 这时&#xff0c;我根据网上的提示安装了两个插件:converttoUtf-8&#xff0c;support Gbk ~~~然而&#xff0c;好像无济于事~~ 于是…

Dynamics AX 2009 升级PreSynchnoize时的无反应的解决

问题: 安装完升级补丁后在Data upgrade cockpit窗口点击Run或Train Run按钮后Update Job没有开始&#xff0c;始终显示为Ready状态。 #1 原因&#xff1a;数据库以前已经做过升级&#xff08;例如安装过AX 2009 SP1&#xff09;并且已经存在一个DataUpdate批处理组但是针对这个…

如何 搭建 RMAN 备份平台

一&#xff0e; RMAN 的一些理论知识RMAN Catalog 和 Nocatalog 的区别http://blog.csdn.net/tianlesoftware/archive/2010/06/02/5641763.aspxRMAN 系列&#xff08;一&#xff09;---- RMAN 体系结构概述http://blog.csdn.net/tianlesoftware/archive/2010/06/09/5659701.asp…

git更新代码报错,error: The following untracked working tree files would be overwritten by ch

git忽略大小写导致的&#xff0c; git config --add core.ignorecase true 转载于:https://www.cnblogs.com/newcbs/p/10732662.html

JavaScript_下_Dom

Dom对象 Dom对象&#xff1a;Document Object Model 文档对象模型。js是用来操作html的。 一个文档必须被加载到浏览器中&#xff0c;会按照HTML的层级结构转换成一个“家谱树”称为dom树。HTML文档里的所以的标签&#xff0c;属性&#xff0c;文本都会转换成dom树上的节点。 …

HDU 4300 Clairewd’s message

一道KMP的变式 本题仍是求最大前缀后缀&#xff0c;所以仍用KMP&#xff0c;但不同的是&#xff0c;本题有一个密码转换规则&#xff0c;不过好在题目中说了两段不重合&#xff0c;那么我们就可以在中间插入一个特殊符号*&#xff0c;保证求next数组时不会越过中线&#xff0c;…