XML:可扩展标记语言。
xml可以当成一个小型的数据库, html
/ \
html5 xhtml(格式比较严格)
|
xml xml解析方式有2种:
-SAX,SAX是基于事件流的解析,事件流解析就是在xml中一行一行的解析不会后头。
-DOM解析,把整个xml这棵树加载到内存里面,需要用哪部分就拿哪部分。dOM解析适合数据量比较小的,数据量比较大就会占内存。 常见的四种解析方式:
.DOM生成和解析XML文档
.SAX生成和解析XML文档
.DOM4J(一种框架和类库)生成和解析XML文档
.JDOM生成和解析XML SAX解析步骤:
.获得解析工厂 SAXParserFactory
.工厂获取解析器SAXParser
.加载文档Document 注册处理器 解析person.xml文件:
<?xml version="1.0" encoding="UTF-8" ?><!--声明部分--><!--
正文,一个xml只有一个根-->
<persons>
<person>
<name>至尊宝</name>
<age></age>
</person>
<person>
<name>白晶晶</name>
<age></age>
</person>
</persons> //对xml进行解析,解析时用到Person类
public class Person {
private String name;
private int age; public Person() {
} public Person(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;
}
} public class ParseDemo01 {//SAX解析XML
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//1、获取解析工厂
/*
protected SAXParserFactory () {
}
构造器是protected,所以不能new
*/
SAXParserFactory factory=SAXParserFactory.newInstance();
//2、从解析工厂获取解析器
SAXParser parse =factory.newSAXParser();
//3、加载文档 Document,注册处理器(指定处理器)
//编写处理器
PersonHandler handler=new PersonHandler();
parse.parse(Thread.currentThread().getContextClassLoader()
.getResourceAsStream("com/bjsxt/xml/person.xml")
,handler ); List<Person> persons =handler.getPersons();
for(Person p:persons){
System.out.println(p.getName()+"-->"+p.getAge());
}
}
} import java.util.ArrayList;
import java.util.List; import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* 存储对象
* @author Administrator
*
*/
public class PersonHandler extends DefaultHandler {
private List<Person> persons;
private Person person;
private String tag;//记录标签名
@Override
public void startDocument() throws SAXException {
System.out.println("处理文档开始");
persons =new ArrayList<Person>();
}
@Override
public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {
System.out.println("开始一个元素" +qName);
if(null!=qName){
tag=qName;
}
if(null!=qName &&qName.equals("person")){
person =new Person();
}
} @Override
public void characters(char[] ch, int start, int length) throws SAXException {
String str =new String(ch,start,length);
if(null!=tag &&tag.equals("name")){
System.out.println(new String(ch,start,length));
person.setName(str);
}else if(null!=tag &&tag.equals("age")){
Integer age = Integer.valueOf(str);
person.setAge(age);
}
} @Override
public void endElement(String uri, String localName, String qName)throws SAXException {
System.out.println("结束一个元素" +qName);
if(qName.equals("person")){
this.persons.add(person);
}
tag =null;
} @Override
public void endDocument() throws SAXException {
System.out.println("文档处理结束");
}
public List<Person> getPersons() {
return persons;
}
public void setPersons(List<Person> persons) {
this.persons = persons;
}
}
/*处理文档开始
开始一个元素persons
开始一个元素person
开始一个元素name
至尊宝
结束一个元素name
开始一个元素age
结束一个元素age
结束一个元素person
开始一个元素person
开始一个元素name
白晶晶
结束一个元素name
开始一个元素age
结束一个元素age
结束一个元素person
结束一个元素persons
文档处理结束
至尊宝-->9000
白晶晶-->7000*/ 解析web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.bjsxt.server.demo4.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
<url-pattern>/g</url-pattern>
</servlet-mapping>
</web-app> //SAX解析
public class WebHandler extends DefaultHandler{
private List<Entity> entityList;
private List<Mapping> mappingList;
private Entity entity;
private Mapping mapping;
private String beginTag ;
private boolean isMap; @Override
public void startDocument() throws SAXException {
//文档解析开始
entityList =new ArrayList<Entity>() ;
mappingList =new ArrayList<Mapping>() ;
} @Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
//开始元素
if(null!=qName){
beginTag=qName;//不同的方法中都要用到的变量就声明为全局变量即成员属性。
if(qName.equals("servlet")){
isMap=false;
entity=new Entity();
}else if(qName.equals("servlet-mapping")){
isMap=true;
mapping=new Mapping();
}
}
} @Override
public void characters(char[] ch, int start, int length)
throws SAXException {
/*
ch数组每次的值都是一样的
[
,
, <, w, e, b, -, a, p, p, >,
,
, , <, s, e, r, v, l, e, t, >,
,
, , , <, s, e, r, v, l, e, t, -, n, a, m, e, >, l, o, g, i, n, <, /, s, e, r, v, l, e, t, -, n, a, m, e, >,
,
, , , <, s, e, r, v, l, e, t, -, c, l, a, s, s, >, c, o, m, ., b, j, s, x, t, ., s, e, r, v, e, r, ., d, e, m, o, 4, ., L, o, g, i, n, S, e, r, v, l, e, t, <, /, s, e, r, v, l, e, t, -, c, l, a, s, s, >,
,
, , <, /, s, e, r, v, l, e, t, >,
,
, , <, s, e, r, v, l, e, t, -, m, a, p, p, i, n, g, >,
,
, , , <, s, e, r, v, l, e, t, -, n, a, m, e, >, l, o, g, i, n, <, /, s, e, r, v, l, e, t, -, n, a, m, e, >,
,
, , , <, u, r, l, -, p, a, t, t, e, r, n, >, /, l, o, g, i, n, <, /, u, r, l, -, p, a, t, t, e, r, n, >,
,
, , , <, u, r, l, -, p, a, t, t, e, r, n, >, /, g, <, /, u, r, l, -, p, a, t, t, e, r, n, >,
,
, , <, /, s, e, r, v, l, e, t, -, m, a, p, p, i, n, g, >,
,
, <, /, w, e, b, -, a, p, p, >,
*/
//处理内容
if(null!=beginTag){
String str =new String(ch,start,length);
if(isMap ){
if(beginTag.equals("servlet-name")){
mapping.setName(str);
}else if(beginTag.equals("url-pattern")){
mapping.getUrlPattern().add(str);
}
}else{
if(beginTag.equals("servlet-name")){
entity.setName(str);
}else if(beginTag.equals("servlet-class")){
entity.setClz(str);
}
}
}
} @Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
//结束元素
if(null!=qName){
if(qName.equals("servlet")){
entityList.add(entity);
}else if(qName.equals("servlet-mapping")){
mappingList.add(mapping);
}
}
beginTag=null;
} @Override
public void endDocument() throws SAXException {
//文档解析结束
} public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//获取解析工厂
SAXParserFactory factory =SAXParserFactory.newInstance();
//获取解析器
SAXParser sax =factory.newSAXParser();
//指定xml+处理器
WebHandler web = new WebHandler();
sax.parse(Thread.currentThread().getContextClassLoader()
.getResourceAsStream("com/bjsxt/server/demo4/web.xml")
,web);
System.out.println(web.getEntityList());
}
public List<Entity> getEntityList() {
return entityList;
}
public void setEntityList(List<Entity> entityList) {
this.entityList = entityList;
}
public List<Mapping> getMappingList() {
return mappingList;
}
public void setMappingList(List<Mapping> mappingList) {
this.mappingList = mappingList;
}
}
/*<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.bjsxt.server.demo4.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
<url-pattern>/g</url-pattern>
</servlet-mapping>
</web-app>
从web-app这个根节点开始,一行一行的向后读。遇到开始元素(<servlet>、<servlet-name>、<servlet-class>、<servlet-mapping>、<url-pattern>)
则会进入startElement方法,遇到结束标签(</servlet>、</servlet-name>、</servlet-class>、</servlet-mapping>、</url-pattern>)
则会进入endElement方法,其余的字符(login、/login、/g)以及空白字符则会进入characters方法。*/ /*
存储这个里面的login和com.bjsxt.server.demo4.LoginServlet
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.bjsxt.server.demo4.LoginServlet</servlet-class>
</servlet>
*/
public class Entity {
private String name;
private String clz;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClz() {
return clz;
}
public void setClz(String clz) {
this.clz = clz;
}
} /*存储这个里面的login和/login、/log
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/log</url-pattern>
</servlet-mapping>
*/
public class Mapping {
private String name;
private List<String> urlPattern; public Mapping(){
urlPattern =new ArrayList<String>();
} public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getUrlPattern() {
return urlPattern;
}
public void setUrlPattern(List<String> urlPattern) {
this.urlPattern = urlPattern;
}
}

java23 XML的更多相关文章

  1. XStream将java对象转换为xml时,对象字段中的下划线“_”,转换后变成了两个的解决办法

            在前几天的一个项目中,由于数据库字段的命名原因 其中有两项:一项叫做"市场价格"一项叫做"商店价格" 为了便于区分,遂分别将其命名为market ...

  2. .NET Core采用的全新配置系统[9]: 为什么针对XML的支持不够好?如何改进?

    物理文件是我们最常用到的原始配置的载体,最佳的配置文件格式主要由三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonConfigurationSource.XmlConfigura ...

  3. WebApi接口 - 响应输出xml和json

    格式化数据这东西,主要看需要的运用场景,今天和大家分享的是webapi格式化数据,这里面的例子主要是输出json和xml的格式数据,测试用例很接近实际常用情况:希望大家喜欢,也希望各位多多扫码支持和点 ...

  4. XML技术之DOM4J解析器

    由于DOM技术的解析,存在很多缺陷,比如内存溢出,解析速度慢等问题,所以就出现了DOM4J解析技术,DOM4J技术的出现大大改进了DOM解析技术的缺陷. 使用DOM4J技术解析XML文件的步骤? pu ...

  5. UWP开发之Mvvmlight实践六:MissingMetadataException解决办法(.Net Native下Default.rd.xml配置问题)

    最近完成一款UWP应用,在手机端测试发布版(Release)的时候应用莫名奇妙的强行关闭,而同样的应用包在PC端一点问题都没有,而且Debug版在两个平台都没有问题,唯独手机的Release版有问题. ...

  6. PHP中遍历XML之SimpleXML

    简单来讲述一些XML吧,XML是可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言.XML是当今用于传输数据的两大工具之一,另外一个是json. 我们在PHP中使用XML也是用来传输数据, ...

  7. Asp.Net 操作XML文件的增删改查 利用GridView

    不废话,直接上如何利用Asp.NET操作XML文件,并对其属性进行修改,刚开始的时候,是打算使用JS来控制生成XML文件的,但是最后却是无法创建文件,读取文件则没有使用了 index.aspx 文件 ...

  8. Mybatis XML配置

    Mybatis常用带有禁用缓存的XML配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...

  9. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

随机推荐

  1. C++如何处理内联虚函数

    http://blog.csdn.net/hedylin/article/details/1775556 当一个函数是内联和虚函数时,会发生代码替换或使用虚表调用吗? 为了弄清楚内联和虚函数,让我们将 ...

  2. Notification 多次传递参数 一直都是旧的 解决

    参考 :http://blog.163.com/caoguoqiang_dlut/blog/static/10658914220114167219320/ 问题描述: 在service中获取到数据,通 ...

  3. @Component("userService").@Resource(name="userDao")

    @Component("userService") public class UserService { private UserDAO userDao; public void ...

  4. cogs_14_搭配飞行员_(二分图匹配+最大流,网络流24题#01)

    描述 http://cojs.tk/cogs/problem/problem.php?pid=14 有一些正飞行员和副飞行员,给出每个正飞行员可以和哪些副飞行员一起飞.一架飞机上必须一正一副,求最多多 ...

  5. Linux下归档与压缩工具笔记

    tar具体使用笔记 归档工具 tar 语法 功能 选项 常见搭配 压缩工具 bzip2 工具 使用方法 gzip 工具 zip 工具 归档工具 tar tar是一个开源的Linux/Unix中最广泛使 ...

  6. Android学习笔记(1)—Android Studio安装

    Android Studio 是一个全新的 Android 开发环境,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工 ...

  7. FZU2236 第十四个目标 dp+树状数组优化

    分析:这种题烂大街,n^2,然后数据结构优化下到nlogn,离散化 #include <cstdio> #include <cstring> #include <queu ...

  8. 利用Testng注释实现多线程并发测试

    Testng 是一款非常优秀的测试框架,真正从测试角度出发,为测试所想.在测试过程中我们经常会遇到对某一个场景做并发请求,主要想了解该程序在并发时是否会有异常或者没考虑到的其他情况,这时往往不是要做性 ...

  9. 【获取图像处理源码以及编译过程】在window下make。

    google 找算法 发现一片不错论文,google作者的主页 找到了相关代码: http://cs.nyu.edu/~ccouprie/code.html code部分--------------- ...

  10. [HZWER]藏妹子之处

    问题描述 今天CZY又找到了三个妹子,有着收藏爱好的他想要找三个地方将妹子们藏起来,将一片空地抽象成一个R行C列的表格,CZY要选出3个单元格.但要满足如下的两个条件: (1)任意两个单元格都不在同一 ...