java EE开发之Servlet第五课:xml解析

1. xml简单介绍

数据存储:数据库做存储存在分析和对比,XML做数据存储更加简洁。

数据交换: XML在跨平台、跨语言

数据配置:XML配置快捷、简单

2. DOM(Document Ojbect Modal)解析步骤

2.1 读取

DocumentBuilderFactory->DocumentBuilder->Document

2.2 创建并输出

2.3 XML文档的CRUD操作

3. DOM常见操作

1,读取XML文件中的内容

//读取XML文件中的内容

//创建一个公司

DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

//创建队伍

DocumentBuilder bui=factory.newDocumentBuilder();

//获取资源(即你要去哪儿读取数据)

Class c=Class.forName("ReadXML");//forName(本类的名称)

InputStream in=c.getResourceAsStream("Stu.xml");

//创建树

Document doc= bui.parse(in);

in.close();

//取出<stu>节点

NodeList nodes=doc.getElementsByTagName("stu");

for(int i=0;i<nodes.getLength();i++){

//取出<stu>节点的id属性值

Element e=(Element)nodes.item(i);

String id=e.getAttribute("id");

//根据<stu>节点取到<stu>节点下的<name>节点

NodeList nodeList=e.getElementsByTagName("name");

//取出<name>节点下的值

Element el=(Element)nodeList.item(0);

String name=el.getTextContent();

2,往XMl中写入信息

//创建公司

DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

//创建队伍

DocumentBuilder bui=factory.newDocumentBuilder();

//创建文档对象

Document doc=bui.newDocument();

//设置版本

doc.setXmlVersion("1.0");

//写入根节点

Element root=doc.createElement("teacher");

doc.appendChild(root);

Scanner input=new Scanner(System.in);

for(int i=0;i<3;i++){

//创建<tea>节点

Element tea=doc.createElement("tea");

System.out.println("请输入老师的编号:");

String id=input.next();

tea.setAttribute("id", id);

//加入属性和<name>节点

Element name=doc.createElement("name");

System.out.println("请输入老师的姓名:");

String n=input.next();

name.setTextContent(n);

tea.appendChild(name);

root.appendChild(tea);

}

//保存XML文件也可调用SaveXML()方法

TransformerFactory fac=TransformerFactory.newInstance();

Transformer tf=fac.newTransformer();

DOMSource source=new DOMSource(doc);

StreamResult result=new StreamResult("f:/teas.xml");

tf.transform(source, result);

3,修改XMl中的信息

//调用得到DOC的方法

Document doc=getDoc();

NodeList nodeList=doc.getElementsByTagName("tea");

for(int i=0;i<nodeList.getLength();i++){

Element el=(Element)nodeList.item(i);

String id=el.getAttribute("id");

if(id.equals(tea.getId())){

NodeList nodes=el.getElementsByTagName("name");

Element name=(Element)nodes.item(0);

name.setTextContent(tea.getName());

break;

}

}

//调用保存的方法

SaveXML(doc);

private static final String FILE="f:/teas.xml";

//得到DOM的方法

public Document getDoc() throws ParserConfigurationException, SAXException,

IOException {

DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

DocumentBuilder bui=factory.newDocumentBuilder();

Document doc=bui.parse(FILE);

return doc;

}

//保存XML文件的方法

private void SaveXML(Document doc)

throws TransformerFactoryConfigurationError,

TransformerConfigurationException, TransformerException {

TransformerFactory factory=TransformerFactory.newInstance();

Transformer tf=factory.newTransformer();

DOMSource source=new DOMSource(doc);

StreamResult result=new StreamResult(FILE);

tf.transform(source, result);

}

3,删除XMl中的信息

//删除方法

public void deleteInfo(String id)throws Exception{

Document doc=getDoc();

doc.getDocumentElement();

NodeList list=doc.getElementsByTagName("tea");

for(int i=0;i<list.getLength();i++){

Element el=(Element)list.item(i);

String ids=el.getAttribute("id");

if(ids.equals(id)){

Element root=doc.getDocumentElement();

root.removeChild(el);

break;

}

}

SaveXML(doc);

}

3.SAX解析:Sax解析是按照xml文件的顺序来解析

SAX(Simple API for XML)是另一种常用的XML解析技术

SAX解析器不像DOM那样建立一个完整的文档树,而是在读取文档时激活一系列事件

这些事件被推给事件处理器,然后由事件处理器提供对文档内容的访问

与DOM相比,SAX的优点如下:

内存消耗小

无需为所有节点创建对象

3.1 继承org.xml.sax.helpers.DefaultHandler类创建SAX解析器

3.1.1 startDocument

3.1.2 endDocument

3.1.3 startElement

3.1.4 endElement

3.1.5 characters:处理元素内容时被调用

3.2 详细的操作步骤解释

1.取节点集合:nodeList getElementsByTagName(“name”);然后通过item()下标访问相应的节点

2.取节点元素的属性:elem.getAttribute(“id”)

3.取节点的文本内容:node.getTextContext();

3.创建节点:doc.createElement()

4.添加子节点: 父节点.appendChild(子节点);

5.删除节点: 父节点.removeChild(子节点);

6.修改节点属性: 节点.setAttribute(“name”,value);

7.修改节点文本内容: 节点.setTextContent("");

写一个类,继承:DefaultHandler,实现其五个方法:

//文档开始了

public void startDocument() throws SAXException {

System.out.println("文档开始了");

}

//文档结束了

public void endDocument() throws SAXException {

System.out.println("文档结束了");

}

//元素开始了

public void startElement(String uri, String localName, String  

                  name,Attributes attributes) throws SAXException {

if(name.equals("tea")){

System.out.println("id:" + attributes.getValue("id"));

}

}

//文本开始了

public void characters(char[] ch, int start, int length)

throws SAXException {

String str=new String(ch,start,length);

if(!str.trim().equals("")){

System.out.println("name:" + str);

}

}

//元素结束了

public void endElement(String uri, String localName, String name)

throws SAXException {  }

然后在test方法中

public static void main(String[] args)throws Exception {

SAXParserFactory fac=SAXParserFactory.newInstance();

SAXParser par=fac.newSAXParser();

par.parse("f:/teas.xml", new SaxTest());

}

New SaxTest是一个new出一个类的实类

注意:增删改都需要 反转义进去, 可以增删改的方法里面 就调用 反转义方法。。。调用就更加方便!!!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容