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. 第六章Audio设备

    6.1 Audio设备介绍 USB协议制定时,为了方便不同设备的开发商基于USB进行设计,定义了不同的设备类来支持不同类型的设备.虽然在USB标准中定义了USB_DEVICE_CLASS_AUDIO- ...

  2. RxJava开发精要4 – Observables过滤

    原文出自<RxJava Essentials> 原文作者 : Ivan Morgillo 译文出自 : 开发技术前线 www.devtf.cn 转载声明: 本译文已授权开发者头条享有独家转 ...

  3. 奇怪的JS

    有的时候发现JS是一门很高深的语言,不是我等俗人可以学会,没有private,没有public不说,居然连Class都没有,这个世界就是这样,有的东西你不一定非要想通,也不一定非要剖根问底,有的时候你 ...

  4. 转载:10个实用的但偏执的Java编程技术

    在沉浸于编码一段时间以后(比如说我已经投入近20年左右的时间在程序上了),你会渐渐对这些东西习以为常.因为,你知道的…… 任何事情有可能出错,没错,的确如此. 这就是为什么我们要采用“防御性编程”,即 ...

  5. DedeCMS 5.7 config.php 跨站脚本漏洞

    漏洞版本: DedeCMS 5.7 漏洞描述: DeDeCMS v5.7 在/include/dialog/config.php文件中存在XSS漏洞,攻击者可以利用该漏洞盗取用户Cookie.挂马等. ...

  6. POJ 2253 Frogger(最小生成树)

    青蛙跳跃,题意大概是:青蛙从起点到终点进行一次或多次的跳跃,多次跳跃中肯定有最大的跳跃距离.求在所有的跳跃中,最小的最大跳跃距离SF-_-(不理解?看题目吧). 可以用最小生成树完成.以起点为根,生成 ...

  7. .net web 点击链接在页面指定位置显示DIV的问题

    做了一个网页,放了两个DataList ,一个显示科室,一个显示科室中的人员,由于科室太多,一屏显示不全,为了在页面刷新时记住上次浏览位置,所以给页面加了MaintainScrollPositionO ...

  8. 手机端的mousedown

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. HtmlParser应用,使用Filter从爬取到的网页中获取需要的内容

    htmlparser是一个纯的java写的html解析的库,它不依赖于其它的java库文件,主要用于改造或提取html.它能超高速解析html,而且不会出错.现在htmlparser最新版本为2.0. ...

  10. 关于css样式的看法

    1.通常有两种方式,第一种是直接写在页面标签中,通过属性style,另一种是通过标签选择器赋样式 第一种方式,就是每一个标签都需要写一遍样式,同时没有做到样式和内容的分离,不方便以后的样式替换,主题的 ...