xml入门与解析
xml入门与解析
1.xml基础知识
xml:可扩展的标签语言,标签自定义.
作用:存储数据.(配置文件)
书写规范:
1.区分大小写
2.应该有一个根标签
3.标签必须关闭
<xx></xx>
<xx/>
4.属性必须用引号引起来,
<xx att="value"/>
5.标签体中的空格或者换行或者制表符等内容都是作为数据内容存在的
<xx>aa</xx>
<xx> aa </xx>
6.特殊字符必须转义
< > &
满足上面规范的文件我们称之为是一个格式良好的xml文件.可以通过浏览器浏览
后缀名:.xml
xml组成部分:
声明:
作用:告诉别人这是一个xml文件
格式: <?xml ..... ?>
例如:
<?xml version="1.0" encoding="UTF-8"?>
<?xml version='1.0' encoding='utf-8' standalone="yes|no"?>
要求:
必须在xml文件的第一行
必须顶格写
元素(标签):
格式:
<xx></xx>
<xx/>
要求:
1.必须关闭
2.标签名不能 xml Xml XML 等等开头
3.标签名中不能出现" "或者":"等特殊字符.
属性:
格式:
<xx 属性名="属性值"/>
要求:
属性必须用引号引起来
注释: 和html一样
<!-- 注释内容 -->
CDATA:
xml文件的特殊字符必须转义,通过cdataky 保证数据原样输出
格式:
<![CDATA[
原样输出的内容
]]>
2.xml解析
解析方式:
1.sax:特点:逐行解析,只能查询.
2.dom:特点:一次性将文档加载到内容中,形成一个dom树.可以对dom树进行curd操作
解析技术:
JAXP:sun公司提供支持DOM和SAX开发包
JDom:dom4j兄弟
jsoup:一种处理HTML特定解析开发包
★dom4j:比较常用的解析开发包,hibernate底层采用。
dom4j技术进行查询操作,使用步骤:
1.导入jar包
2.创建一个核心对象 SAXReader
new SAXReader();
3.将xml文档加载到内存中形成一棵树
Document doc=reader.read(文件)
4.获取根节点
Element root=doc.getRootElement();
5.通过根节点就可以获取其他节点(文本节点,属性节点,元素节点)
获取所有的子元素
List<Element> list=root.elements()
获取元素的指定属性内容
String value=root.attributeValue("属性名");
获取子标签标签体:遍历list 获取到每一个子元素
String text=ele.elementText("子标签名称")
示例一:

student.java源码:
package com.hjh.xml.day0527;
public class Student {
private int id;
private String name;
private String gender;
public Student() {}
public Student(int id,String name,String gender) {
this.id = id;
this.name = name;
this.gender = gender;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", gender=" + gender + "]";
}
}
student.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version='2.5'>
<servlet>
<servlet-name>student</servlet-name>
<servlet-class>com.hjh.xml.day0527.Student</servlet-class>
</servlet>
<servlet_mapping>
<servlet-name>student</servlet-name>
<url-pattern>/student</url-pattern>
</servlet_mapping>
</web-app>
dom4jTest01.java源码:
package com.hjh.xml.day0527; import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; public class dom4jTest01 {
public static void main(String []args) throws Exception { //创建核心对象
SAXReader sr = new SAXReader(); //获取document树
Document doc = sr.read("../Xml/src/xml/student.xml"); //获取根节点
Element root = doc.getRootElement();
System.out.println("根节点名称是: "+root.getName()); //获取root属性version的属性值
String value = root.attributeValue("version");
System.out.println("root version的属性值为:"+value); //获取根节点的子节点
List<Element> list = root.elements(); //遍历子节点
for (Element el : list) {
//输出子节点的name
System.out.println("子节点名称: "+el.getName());
//输出指定子节点的内容
String text = el.elementText("servlet-class");
System.out.println(text);
}
}
}
console输出:

xpath解析技术:(扩展)
依赖于dom4j
使用步骤:
1.导入jar包(dom4j和jaxen-1.1-beta-6.jar)
2.加载xml文件到内存中
3.使用api
selectNode("表达式");
selectSingleNode("表达式");
表达式的写法:
/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
例如一个标签下有一个id属性且有值 id=2;
//元素名[@属性名='属性值']
//元素名[@id='2']
案例:

student.java略,同上
xpath.xml如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app version='2.5'>
<servlet>
<servlet-name>student</servlet-name>
<servlet-class>com.hjh.xml.day0527.xpathTest01</servlet-class>
</servlet>
<servlet_mapping>
<servlet-name>student</servlet-name>
<url-pattern>/student</url-pattern>
</servlet_mapping>
</web-app>
xpathTest01.java源码:
package com.hjh.xml.day0527; import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test; public class xpathTest01 { @Test
public void run() throws Exception {
//加载document树
Document doc = new SAXReader().read("../Xml/src/xml/xpath.xml"); //获取节点 xpath方式
Element el = (Element) doc.selectSingleNode("//servlet/servlet-class");
System.out.println(el.getText()); //com.hjh.xml.day0527.xpathTest01
}
}
3.反射
1.获取对应的class对象
方式1:★
Class clazz=Class.forName("全限定名");
方式2:
Class clazz=类名.class;
方式3:
Class clazz==对象.getClass();
2.通过class对象创建一个实例对象(相当于 new 类())
Object clazz.newInstance();
3.通过class对象获取一个方法(public修饰的)
Method method=clazz.getMethod("方法名",Class .... paramType);
paramType为参数的类型
4.让方法执行:
method.invoke(Object 实例对象,Object ... 参数);
Object 实例对象:以前调用方法的对象 就是a
Object ... 参数:该方法运行时需要的参数 就是 10和30
执行这个方法 相当于
a.add(10,30);
例如:
method.invoke(a,10,30)
案例:

User.java源码:
package com.hjh.xml.day0527;
public class User {
public void add() {
System.out.println("空参add方法");
}
public void add(int i,int j) {
System.out.println("带2个参数的add方法"+(i+j));
}
}
web.xml如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app version='2.5'>
<servlet>
<servlet-name>reflect</servlet-name>
<servlet-class>com.hjh.xml.day0527.reflectTest01</servlet-class>
</servlet>
<servlet_mapping>
<servlet-name>reflect</servlet-name>
<url-pattern>/reflect</url-pattern>
</servlet_mapping>
</web-app>
reflectTest01.java源码如下:
package com.hjh.xml.day0527; import java.lang.reflect.Method;
import org.junit.Test; public class reflectTest01 { @Test
public void f1() {
//创建User对象,调用add方法
User user = new User();
user.add();
user.add(11, 22);
} @Test
public void f2() throws Exception {
//反射 Class.forname()
Class<?> clazz = Class.forName("com.hjh.xml.day0527.User");
//通过字节码对象,创建一个实例对象(相当于调用空参的构造器)
User user = (User) clazz.newInstance();
//调用方法
user.add();
user.add(1, 2);
} @Test
public void f3() throws Exception {
//反射 Class.forname()
Class<?> clazz = Class.forName("com.hjh.xml.day0527.User");
//通过字节码对象,创建一个实例对象(相当于调用空参的构造器)
User user = (User) clazz.newInstance();
//获取方法对象
Method method = clazz.getMethod("add");
//让方法对象执行
method.invoke(user);//相当于user.add();
} @Test
public void f4() throws Exception {
//反射 类名.class
Class<User> clazz = User.class;
//通过clazz创建一个实例对象
User user = (User) clazz.newInstance();
//获取带参的add方法
Method m = clazz.getMethod("add", int.class,int.class);
//执行方法
m.invoke(user, 10,20);//相当于user.add(10,20);
}
}
综合案例:
user.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version='2.5'>
<servlet>
<servlet-name>user</servlet-name>
<servlet-class>com.hjh.xml.day0527.User</servlet-class>
</servlet>
<servlet_mapping>
<servlet-name>user</servlet-name>
<url-pattern>/user</url-pattern>
</servlet_mapping>
</web-app>
Demo02.java源码:
package com.hjh.xml.day0527; import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test; public class Demo2 { @Test
public void show() throws Exception {
//创建document对象
Document doc = new SAXReader().read("../Xml/src/xml/user.xml"); //通过xpatn解析,获取servlet-class和url-pattern的标签体
Element servletClass = (Element) doc.selectSingleNode("//servlet-class");
Element urlPattern = (Element) doc.selectSingleNode("//url-pattern"); //获取标签体中的文本
String classTest = servletClass.getText();
String urlTest = urlPattern.getText(); //定义一个map
Map<String, String> map = new HashMap<String, String>();
map.put(urlTest, classTest); //通过key,获取值
String value = map.get("/user"); //通过反射,创建一个实例
Class<?> clazz = Class.forName(value);
User user= (User) clazz.newInstance(); //获取方法
Method m = clazz.getMethod("add");
m.invoke(user);
}
}
4.xml约束
作用:规定xml中可以出现那些元素及那些属性,以及他们出现的顺序以及次数.
约束的分类:
DTD约束:struts hiebernate等等
SCHEMA约束:tomcat spring等等
DTD约束:
和xml的关联 (一般都会提供好,复制过来即可,有时候连复制都不需要.)
方式1:内部关联
格式:
<!DOCTYPE 根元素名 [dtd语法]>
方式2:外部关联-系统关联
格式:
<!DOCTYPE 根元素名 SYSTEM "约束文件的位置">
例如:
<!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">
方式3:外部关联-公共关联
格式:
<!DOCTYPE 根元素名 PUBLIC "约束文件的名称" "约束文件的位置">
DTD语法:
元素:
<!Element 元素名称 数据类型|包含内容>
数据类型:
#PCDATA:普通文本 使用的时候一般用()引起来
包含内容:
该元素下可以出现那些元素 用()引起来
符号:
* 出现任意次
? 出现1次或者0次
+ 出现至少1次
| 或者
() 分组
, 顺序
属性:
格式:
<!ATTLIST 元素名 属性名 属性类型 属性是否必须出现>
属性类型:
ID:唯一
CDATA:普通文本
属性是否必须出现
REQUIRED:必须出现
IMPLIED:可以不出现
一个xml文档中只能添加一个DTD约束
按f2或者 alt+/提示写出内容
SCHEMA约束:
一个xml文档中可以添加多个schema约束
xml和schema的关联.
格式:
<根标签 xmlns="..." ...>
<根标签 xmlns:别名="..." ...>
名称空间:
关联约束文件
规定元素是来源于那个约束文件的
例如:
一个约束文件中规定 table(表格) 表格有属性 row和col
还有一个约束文件规定 table(桌子) 桌子有属性 width和height 在同一个xml中万一把两个约束文件都导入了,
在xml中写一个table,这个table有什么属性????
我们为了避免这种情况的发生,可以给其中的一个约束起个别名
使用的时候若是没有加别名那就代表是来自于没有别名的约束文件
例如 table(表格) 给他起个别名 xmlns:a="..."
在案例中使用 a:table 代表的是表格
若在案例中直接使用 table 代表的是桌子
在一个xml文件中只能有一个不起别名;
注意:
schema约束本身也是xml文件.
xml入门与解析的更多相关文章
- xml语法、DTD约束xml、Schema约束xml、DOM解析xml
今日大纲 1.什么是xml.xml的作用 2.xml的语法 3.DTD约束xml 4.Schema约束xml 5.DOM解析xml 1.什么是xml.xml的作用 1.1.xml介绍 在前面学习的ht ...
- xml入门简介--两天学会xml
前言 在很久以前,笔者曾见到过1000+页的xml书,里面还有n多的概念,XSL,Xquery,让人头痛.无奈最近需要用到,所以在w3c恶补了一下.以下大致整理了一下相关概念,但是对XSL等派生语言没 ...
- XML学习总结(二)——XML入门
XML学习总结(二)——XML入门 一.XML语法学习 学习XML语法的目的就是编写XML 一个XML文件分为如下几部分内容: 文档声明 元素 属性 注释 CDATA区 .特殊字符 处理指令(proc ...
- (5)微信二次开发 之 XML格式数据解析
1.首先理解一下html html的全名是:HyperText Transfer markup language 超级文本标记语言,html本质上是一门标记(符合)语言,在html里,这些标记是事先定 ...
- 【mybatis深度历险系列】mybatis的框架原理+入门程序解析
在前面的博文中,小编介绍了springmvc的相关知识点,在今天这篇博文中,小编将介绍一下mybatis的框架原理,以及mybatis的入门程序,实现用户的增删改查,她有什么优缺点以及mybatis和 ...
- Spring源码入门——DefaultBeanNameGenerator解析 转发 https://www.cnblogs.com/jason0529/p/5272265.html
Spring源码入门——DefaultBeanNameGenerator解析 我们知道在spring中每个bean都要有一个id或者name标示每个唯一的bean,在xml中定义一个bean可以指 ...
- XML入门介绍
目录 XML 简介 xml 语法 文档声明 (1)创建一个 xml 文件 (2)图书有 id 性 属性 一 表示唯一 标识,书名,有作者,价格的信息 xml 注释 元素(标签) 1)什么是 xml 元 ...
- XML数据的解析
XML数据的解析 相比于JSON数据解析而言,XML数据解析可能会让更多的童鞋感觉到吃力,对我来说,同样认为JSON数据好像让人感觉比较友好,不过对于程序开发者来说,无非就是这两种数据解析占比较大的部 ...
- iOS开发笔记3:XML/JSON数据解析
这篇主要总结在iOS开发中XML/JSON数据解析过程用到的方法.XML数据解析主要使用SAX方式的NSXMLParser以及DOM方式的GDataXML,JSON数据解析主要使用NSJSONSeri ...
随机推荐
- 19-10-18-Y
ZJ一下: 感觉能拿到的分都拿到了,至于后来改题就缶了 其实是:太tui导致没改好 TJ: T1: 正解是$\mathsf{KMP}$,但是广大群众都用了$\mathsf{hash}$…… 发现了一个 ...
- Location protocol 属性
Location protocol 属性 定义和用法 protocol 属性是一个可读可写的字符串,可设置或返回当前 URL 的协议. 语法 location.protocol <!DOCTYP ...
- JEECG-Boot 开发环境准备(一):技术点
需要掌握的基础知识 序号 知识点 资料 1 Npm 命令 http://www.runoob.com/nodejs/nodejs-npm.html 2 Node.js 入门 http://www.ru ...
- PAT甲级——A1040 Longest Symmetric String
Given a string, you are supposed to output the length of the longest symmetric sub-string. For examp ...
- Maven实战07_依赖
1:依赖声明 <project> ... <dependencies> <dependency> <groupId>...</groupId> ...
- Eureka自我保护机制、健康检查的作用、actuator模块监控
在上一篇文章微服务入门之服务的注册以及服务之间的调用中,我们基本实现了服务之间的调用,今天我们来了解一下Eureka自我保护机制以及健康检查. Eureka自我保护机制 接着以上篇文章建立的三个工程为 ...
- JMETER的三个线程组
JMETER的三个线程组 Jmeter有三个线程组分类:Thread Group(线程组).setUp Thread Group.tearDown Thread Group,如下图所示: (1).th ...
- jmeter断言步骤
在POST /wordpress/wp-login.php请求,也就是名称为submit login form user的请求上点右键, 选择添加 -> 后置处理器 -> CSS/JQue ...
- LuoguP3690 【模板】Link Cut Tree (动态树) LCT模板
P3690 [模板]Link Cut Tree (动态树) 题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两 ...
- ETH功能类
<?php /** * Ethereum JSON-RPC interface * * See Ethereum API documentation for more information: ...