XML 解析XML文档 XML约束
XML
什么是XML
- Extensible Markup Language(可扩展的标记语言)
- 他是一个语言,有自己的语法,和Java以及其他的编程无关
- “标记” 在文件中包含类似于张三 ,这种用尖括号括起来的叫标记,使用来标记数据的。标记可以嵌套,有包含、所属关系。XML是纯文本文档,它是由“标记+数据”组成
例如:
建立文件:clases.xml
<类库>
<属性></ 属性>
< /类库>
XML 的作用
- 存储数据【以后数据库存储文件】
- 做配置文件【重点应用方式】
XML的语法
1、文档声明
- 一个格式化好的XML文档,应该有一个“文档声明”,不是必须有
- 文档声明格式:
2、XML的语法_元素(标签)
- 元素:也叫标记、标签。
标签分类
完整标签:有开始标签,和结束标签
<name>张三</name>
单标签:只有开始标签,没有结束标签;单标签可以通过属性来记录数据
<property name="id" value="it001"/>
标签的语法
- 标签名称可以包含大部分的字符,包括中文
- 标签里可以包括以下的符号:“、 _ - . ”
- 但只能以字母、下划线、冒号开头
标签的内容:
- 可以是“数据”
<name>张三</name>
可以是子标签
- 可以是“数据”
区分大小写
3、属性:唯一的
- 一个标签中可以定义任意多个的“属性”,属性的作用:存储数据。
语法规则
- 一个标签可以定义0或者多个属性,属性名不能重名,用空格隔开
属性的格式:属性名=“属性值”属性值必须要用单引号或者双引号括起来
(认为单引号或者双引号里的内容是数值)属性,必须定义在开始标签中。
4、注释
5、转义字符
如果数据中包含大量的转义字符,编写时可读性不好。可以使用CDATA区来标志数据。
6、解析XML文档 两种方式
- DOM解析:一次性将整个文档读取到内存中,会将内部的各种标签已经属性、数据等信息全部封装到一个对象中。最终形成DOM对象,在DOM对象内容保留文档的结构信息。优点:内存中保留文档的结构进行修改(增加、修改、删除元素等修改)。缺点:如果文档很大,会占用内存。
- SAX解析:一次读取,解析一行,读取下一行,之前的信息会被丢掉。优点:速度快,缺点:没有文档结构,不能进行节点的增删改查。
- PULL解析:用于Android系统内容不的解析方式。类型于SAX。
7、解析器
- JAXP
- JDom
- Jsoup
- dom4j:第三方开发包,内部结合了DOM和SAX解析的方式
8、解析原理 是一个创建树的过程
XML文档读取到内存的过程:先创建一个DOM对象(Document);在创建一个节点Element(根元素)对象;创建子元素Element(节点)对象在根元素下面;创建属性(Attribute)对象在子节点对象下面;值(一般是String)对象在属性对象下面;
Document|--根元素【Element】|--子元素|--属性对象【Attribute】|--值对象|--子元素对象(Element)|--值对象|--子元素对象
9、XML文档读取步骤
准备工作:引入第三方工具包Dom4j.jar
- 创建SAXReader对象
- 对象对去XML文档,生成DOM树
- 获取根元素
- 获取到根元素后,利用它获得其他的子元素还有它自己在的属性(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约束
- DTD:对一些简单的XML文件进行约束
- Schema:对一些比较复杂的XML文档进行更加细致、广泛的约束。
XML约束可以约束:
- 根元素下都可以出现哪些子元素
- 元素出现的顺序、次数
- 元素包含的属性
- 元素中包含哪些子元素或者数据
- 等
DTD约束条件的引入
- 内部引入
引入外部(本地)
引入外部(网络)
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镜像之后,如何连接物理机和虚拟机呢?这就需要网络连接,网络连接有三种:HostOnly、NAT、Bridge,它们都可用于Guest虚拟机和Host物理机之间的网络通信。 一、三者的不…

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

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

Docker应用:Kubernetes(容器集群)
Docker应用:Kubernetes(容器集群) 原文:Docker应用:Kubernetes(容器集群)阅读目录: Docker应用:Hello WorldDocker应用:Docker-compose(容器编排)…
通道应用——抠头发
通道应用——抠头发 原图: 效果图: 步骤:1、打开原图的“通道面板”,选择颜色对比分明的绿色通道,并新建一个绿色通道副本;2、选择“图像”-“调整”-“色阶”,调节色阶使得头发颜色更分明些&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对象(javaBean) 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编写定时任务时候,发现for循环只执行i0这一次,就不接着循环执行了,下面贴上代码: exports.task async function(ctx){ let { app } ctx, resultArr1 [],//查询的数据库数据 resultArr2 [];//查询的数据库…

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

好用的截图工具
好用的截图工具...简单好用而且不大转载于:https://blog.51cto.com/dd123/208983
“AS3.0高级动画编程”学习:第二章转向行为(上)
因为这一章的内容基本上都是涉及向量的,先来一个2D向量类:Vector2D.as (再次强烈建议不熟悉向量运算的童鞋,先回去恶补一下高等数学-07章空间解释几何与向量代数.pdf) package {import flash.display.Graphics;public class Vector2D {privat…

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

C3P0_and_pro.properties配置文档代码
C3P0-config.xml配置文件 <c3p0-config> <!-- 默认配置,如果没有指定则使用这个配置 --> <default-config><property name"driverClass">com.mysql.jdbc.Driver</property><property name"jdbcUrl">jdbc:…
电视信号——行场同步
电视信号分NTSC制和PAL制两种制式, NTSC制每秒刷新60次, 而PAL制每秒刷新50次。 水平消隐:电子枪从左到右画出象素,它每次只能画一条扫描线,画下一条之前要先回到左边并做好画下一条扫描线的准备,这之间有一段时间叫做水平消隐&am…

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

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

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

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

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

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

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

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

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

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

如何 搭建 RMAN 备份平台
一. RMAN 的一些理论知识RMAN Catalog 和 Nocatalog 的区别http://blog.csdn.net/tianlesoftware/archive/2010/06/02/5641763.aspxRMAN 系列(一)---- 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忽略大小写导致的, git config --add core.ignorecase true 转载于:https://www.cnblogs.com/newcbs/p/10732662.html

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

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