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. Android SurfaceView实现全屏播放例子

    public class Mymedia extends Activity implements OnBufferingUpdateListener, OnCompletionListener, Me ...

  2. 【HDOJ】3509 Buge's Fibonacci Number Problem

    快速矩阵幂,系数矩阵由多个二项分布组成.第1列是(0,(a+b)^k)第2列是(0,(a+b)^(k-1),0)第3列是(0,(a+b)^(k-2),0,0)以此类推. /* 3509 */ #inc ...

  3. Android开发之ListView-BaseAdapter的使用

    ListView优化原则: UI优化: listview条目与条目之间的间隙的分割内容 : android:divider="@android :color/transparent" ...

  4. BZOJ_1601_[Usaco2008_Oct]_灌水_(最小生成树_Kruskal)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1601 有\(n\)个田地需要灌溉,每个田地可以自己引水,花费为\(w[i]\),或者连接其他被 ...

  5. C# VS2010中,用微软自带的System.Data.OracleClient来连接Oracle数据库

    由于微软在.Net框架4.0中已经决定撤销使用System.Data.OracleClient,造成在VS2010中无法连接Oracle数据库,但它还依旧存在于.Net架构中,我们可以通过自己引用 C ...

  6. [未解出,hzwer]挖掘机

    挖掘机(dig.*) 背景 附中机房谁最虚?高二一班***!感觉很顺,是吧? 题目描述 今天,丧尸czy开着挖掘机去上学(……).但是他发现他的mz满天下,所以一路上他碰到了好多他的mz.一开始他以1 ...

  7. [codevs1554]最佳课题选择

    题目描述 Matrix67要在下个月交给老师n篇论文,论文的内容可以从m个课题中选择.由于课题数有限,Matrix67不得不重复选择一些课题.完成不同课题的论文所花的时间不同.具体地说,对于某个课题i ...

  8. 【CSS】Beginner4:Text

    1.alter the size and shape of the text 2.font-family:Arial, Verdana,"Times New Roman",helv ...

  9. Bzoj 1565: [NOI2009]植物大战僵尸 最大权闭合图,拓扑排序

    题目: http://cojs.tk/cogs/problem/problem.php?pid=410 410. [NOI2009] 植物大战僵尸 ★★★   输入文件:pvz.in   输出文件:p ...

  10. Android ListView 全面优化

    结合昨天学习的多线程,今天又继续对ListView进行了优化,包括异步加载图片,滑动时暂停加载,滑动停止后再加载显示界面中的item. 综合ListView在使用时参考的多篇博客,这里对ListVie ...