本章节我们要学习XML三种解析方式:

1、JAXP DOM 解析
2、JAXP SAX 解析
3、XML PULL 进行 STAX 解析

XML 技术主要企业应用
1、存储和传输数据
2、作为框架的配置文件

使用xml 存储和传输数据
1、通过程序生成xml
2、读取xml 中数据 ---- xml 解析

什么是DOM和SAX ?
DOM Document Object Model ----- 文档对象模型
DOM思想: 将整个xml 加载内存中,形成文档对象,所有对xml操作都对内存中文档对象进行
DOM 是官方xml解析标准
* 所有开发语言都支持的

Java、JavaScript 都支持DOM

SAX Simple API for XML ----- XML 简单 API
程序员为什么发明sax解析方式?? 当xml 文档非常大,不可能将xml所有数据加载到内存
SAX 思想:一边解析 ,一边处理,一边释放内存资源 ---- 不允许在内存中保留大规模xml 数据

StAX The Stream API for XML ----- XML 流 API
STAX 是一种 拉模式 xml 解析方式,SAX 是一种 推模式 XML 解析方式

推push模式:由服务器为主导,向客户端主动发送数据
拉pull模式: 由客户端为主导,主动向服务器申请数据

程序员在实际开发中,使用已经开发好工具包 ----- JAXP 、DOM4j 、XML PULL

解析方式 与 解析开发包 关系?
解析方式是解析xml 思想,没有具体代码,解析开发包是解析xml思想具体代码实现

JAXP 是sun官方推出实现技术 同时支持 DOM SAX STAX
DOM4j 是开源社区开源框架 支持 DOM 解析方式
XML PULL Android 移动设备内置xml 解析技术 支持 STAX 解析方式

当SAX和STAX 读取xml数据时,如果读取到内存数据不释放 ----- 内存中将存在整个xml文档数据
(类似DOM 支持修改和回写)。

DOM、SAX、STAX 在实际开发中选择?
在javaee日常开发中 ---- 优先使用DOM (编程简单)
当xml 文档数据非常多,不可能使用DOM ---造成内存溢出 ------ 优先使用STAX
移动开发 使用 STAX ---- Android XML PULL

JAXP 开发 进行 xml解析 :
javax.xml.parsers 存放 DOM 和 SAX 解析器
javax.xml.stream 存放 STAX 解析相关类
org.w3c.dom 存放DOM解析时 数据节点类
org.xml.sax 存放SAX解析相关工具类

DOM 解析快速入门
1、创建 xml 文档 books.xml
在企业实际开发中,为了简化xml 生成和解析 ---- xml 数据文件通常不使用约束的
2、使用DOM解析xml
将整个xml文档加载到内存中 : 工厂 --- 解析器 --- 解析加载
3、Document通过 getElementsByTagName 获得 节点集合 NodeList
通过 NodeList 提供 getLength 和 item 遍历 节点集合

遍历ArrayList
for (int i=0;i<arraylist.size();i++){
arraylist.get(i);
}

遍历NodeList
for (int i=0;i<nodelist.getLength();i++){
nodelist.item(i); ----- 将遍历每个节点转换子接口类型
}

什么是 Node? 对于xml 来说,xml所有数据都是node节点包括:
(元素节点、属性节点、文本节点、注释节点、CDATA节点、文档节点)。

Element Attr Text Comment CDATASection Document ----- 都是 Node 子接口

node有三个通用API :
getNodeName():返回节点的名称
getNodeType():返回节点的类型
getNodeValue():返回节点的值 ---- 所有元素节点value都是 null

------------------------------------------------------------------------------------
DOM 编程思路小结
1、装载XML文档 ---- Document
2、Document 获得指定元素 ----- getElementsByTagName (返回 NodeList)
3、遍历NodeList 获得 每个 Node
4、将每个Node 强制转换 Element
5、通过元素节点API 操作属性和文本内容
getAttribute 获得属性值
getTextContent 获得元素内部文本内容

<?xml version="1.0" encoding="UTF-8"?>
<books>
<book>
<name>java编程思想</name>
<price>88</price>
</book>
<book>
<name>java编程高手</name>
<price>99</price>
</book>
</books>

books2.xml

package com.shellway.javase;

import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException; public class demo1 {
@Test
public void getElement() throws ParserConfigurationException, SAXException, IOException{
DocumentBuilderFactory douBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = douBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse("xml/books2.xml");
//通过父节点获得相应书籍《java编程思想》图书的价格
NodeList nodeList = document.getElementsByTagName("book");
for (int i = 0; i < nodeList.getLength(); i++) {
Element element = (Element) nodeList.item(i);
Element element1 = (Element) element.getChildNodes().item(1);
if (element1.getTextContent().equals("java编程思想")) {
System.out.println(element.getChildNodes().item(3).getTextContent());
}
}
} @Test
public void getElement2() throws ParserConfigurationException, SAXException, IOException{
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse("xml/books2.xml");
//通过兄弟节点获得相应书籍《java编程高手》的价格
NodeList nodeList = document.getElementsByTagName("name");
for (int i = 0; i < nodeList.getLength(); i++) {
Element element = (Element) nodeList.item(i);
if (element.getTextContent().equals("java编程高手")) {
String str = element.getNextSibling().getNextSibling().getTextContent();
System.out.println(str);
}
}
}
}

获得相应书籍《java编程高手》的价格

通过id来找到对应的元素节点,是通过id的值。前提还必须要求本此元素节点所在的xml文档有约束。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books [
<!ELEMENT books (book+) >
<!ELEMENT book (name,price)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ATTLIST name
id ID #REQUIRED>
]> <books>
<book>
<name id="b001">java编程思想</name>
<price>88</price>
</book>
<book>
<name id ="b002">java编程高手</name>
<price>99</price>
</book>
</books>

具有内部DTD约束条件的xml文档:books2.xml

    @Test
public void getElement3() throws Exception {
//通过id借助它的值找到对应的元素节点
DocumentBuilderFactory documentBuilderFactory =
DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse("xml/books2.xml"); Element element = document.getElementById("b001");
System.out.println(element.getTextContent());
System.out.println(element.getNextSibling().getNextSibling().getTextContent());
}

通过id借助它的值找到对应的元素节点测试函数

先用全局查找锁定范围,再用相对关系查找 得到需要数据

getElementById 方法 必须用于带有约束 xml文档中 !!!!!!!

所以开发语言默认支持DTD,当使用Schema时,单独编程导入schema !

XML DOM 增加 、修改 和 删除操作 ------ 操作 内存中文档对象

XML的回写

XML元素添加 : 1、创建节点元素 2、将节点元素加入指定位置

XML元素修改 : 查询到指定元素 1、修改属性 setAttribute
                                          2、修改元素文本内容 setTextContent

XML元素删除 :删除节点.getParentNode().removeChild(删除节点)

<?xml version="1.0" encoding="UTF-8" standalone="no"?><books>
<book>
<name id="b001">java编程思想</name>
<price>88</price>
</book>
<book>
<name id="b002">java编程高手</name>
<price>100</price>
</book>
<book>
<name id="b002">编程高手秘笈</name>
<price>120.0</price>
</book>
</books>

books2.xml

package com.shellway.javase;

import java.io.File;
import java.io.IOException; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult; import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList; public class demo2 {
@Test
public void testAddForDom() throws Exception{
//加载XML文档到内存中:创建工厂---加载器---加载文档
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse("xml/books2.xml"); //获得根节点
Element root = document.getDocumentElement();
//创建一个新节点
Element user = document.createElement("user");
root.appendChild(user);
//设置name的内容,并且添加为元素user的子节点
Element name = document.createElement("name");
name.setTextContent("张三");
user.appendChild(name);
//为name添加一个属性
name.setAttribute("id", "b003"); //回写内容到XML中
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource domSourse = new DOMSource(document);
StreamResult stream = new StreamResult("xml/books2_bak.xml");
transformer.transform(domSourse,stream );
} @Test
public void testUpdateForDom() throws Exception{
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse("xml/books2.xml"); NodeList nodeList = document.getElementsByTagName("name");
for (int i = 0; i < nodeList.getLength(); i++) {
Element name = (Element) nodeList.item(i);
if (name.getTextContent().equals("java编程高手")) {
Element priceN = (Element) name.getNextSibling().getNextSibling();
Double price = Double.parseDouble(priceN.getTextContent());
price = price * 1.2;
priceN.setTextContent(price+"");
}
} //回写到xml
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer(); DOMSource domSource = new DOMSource(document);
StreamResult streamResult = new StreamResult(new File("xml/books2.xml"));
transformer.transform(domSource, streamResult);
} @Test
public void testDeleteForDom() throws Exception{ DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse("xml/books2.xml"); NodeList nodeList = document.getElementsByTagName("name");
for (int i = 0; i < nodeList.getLength(); i++) {
Element name = (Element) nodeList.item(i);
//删除包含有java的书籍
if (name.getTextContent().contains("java")) {
//得到此节点的父节点,因为删除必须通过父节点才能删除自己
Element element = (Element) name.getParentNode();
element.getParentNode().removeChild(element);
//注意:当删除第一个节点后,第二个节点会变成第一个节点,所以要i--
i--;
}
}
//回写到xml
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer(); DOMSource domSource = new DOMSource(document);
StreamResult streamResult = new StreamResult(new File("xml/books2.xml"));
transformer.transform(domSource, streamResult);
}
}

xml的增、删、改

--------------------------------------------------------------------------
SAX 和 STAX 都是 基于事件驱动 ----- SAX推模式 STAX拉模式
SAX常用事件
startDocument() ---- 文档开始事件
startElemen() ---- 元素开始事件
characters() ---- 文本元素事件
endElement() ---- 元素结束事件
endDocument() ----- 文档结束事件

为什么说SAX是推模式解析? 解析器控制xml文件解析,由解析器调用相应事件方法

在startElemen() endElement() 获得开始和结束元素名称
在characters() 获得读取到文本内容
在startElemen() 读取属性值

JAXP SAX的原理和使用练习:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<books>
<book>
<name id="b001">java编程思想</name>
<price>88</price>
</book>
<book>
<name id="b002">java编程高手</name>
<price>100</price>
</book>
<book>
<name id="b003">编程高手秘笈</name>
<price>120.0</price>
</book>
</books>

books2.xml

package com.shellway.javase;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.junit.Test;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; public class demo3 {
@Test
public void testSax() throws Exception{
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
SAXParser saxParser = saxParserFactory.newSAXParser(); myHandler handler = new myHandler();
saxParser.parse("xml/books2.xml",handler);
}
} class myHandler extends DefaultHandler {
@Override
public void startDocument() throws SAXException {
System.out.println("startDocument...");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.println("startElement:"+qName);
if (qName.equals("name")) {
String str = attributes.getValue("id");
System.out.println(str+"-------");
}
}
@Override
public void characters(char[] ch, int start, int length){
String str = new String(ch,start,length);
System.out.println("characters:"+str);
}
@Override
public void endElement(String uri, String localName, String qName){
System.out.println("endElement:"+qName);
}
@Override
public void endDocument() throws SAXException {
System.out.println("endDocument...");
}
}

jaxp sax的使用例子

STAX 拉模式xml 解析方式 ----- 客户端程序,自己控制xml事件,主动调用相应事件方法

当使用XML PULL 如果使用Android系统,系统内置无需下载任何开发包,如果想JavaSE JavaEE
使用pull 解析技术 下载单独pull 开发工具包。

xpp3 ----- XML Pull Parser 3 是pull API 代码实现

使用pull 解析器
1、去网站上 下载 pull 解析器实现 xpp3 (Android 内置)
2、将 xpp3-1.1.3.4.C.jar 导入 java工程
导入jar包 位于 当前工程内部 , 在工程内新建 lib ,将jar复制过来 , 将pull 解析器 jar 添加build path

jar 包就是.class文件 集合压缩包 (采用zip格式压缩)

Pull解析器 使用 stax 解析方式 ---- 拉模式解析
Pull采用将xml文档传递 解析器,手动通过next触发文档解析事件,在客户端代码中获取当前事件 ,从而调用相应事件处理方法

3、创建pull 解析器
4、将xml 文档内容传递 pull 解析器

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<books>
<book>
<name id="b001">java编程思想</name>
<price>88</price>
</book>
<book>
<name id="b002">java编程高手</name>
<price>100</price>
</book>
<book>
<name id="b003">编程高手秘笈</name>
<price>120.0</price>
</book>
</books>

books2.xml

import java.io.FileInputStream;

import org.junit.Test;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory; public class demo4 { @Test
public void testPull2() throws Exception{
XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser();
xmlPullParser.setInput(new FileInputStream("xml/books2.xml"), "utf-8"); int event;
boolean flag = false;
while((event = xmlPullParser.getEventType())!=XmlPullParser.END_DOCUMENT){
if(event==XmlPullParser.START_TAG&&xmlPullParser.getName().equals("name")){
String name = xmlPullParser.nextText();
if(name.equals("java编程高手")){
flag = true;
// xmlPullParser.next();
// xmlPullParser.next();
// System.out.println(xmlPullParser.nextText());
}
}
if(event == xmlPullParser.START_TAG&&xmlPullParser.getName().equals("price")&&flag){
System.out.println(xmlPullParser.nextText());
//flag = false;或者推出循环
break;
}
xmlPullParser.next();
}
} @Test
public void testPull() throws Exception{
XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser();
xmlPullParser.setInput(new FileInputStream("xml/books2.xml"), "utf-8"); int event;
while((event = xmlPullParser.getEventType())!=XmlPullParser.END_DOCUMENT){
// if(event == XmlPullParser.START_TAG){
System.out.println(xmlPullParser.getEventType());
// }
//处理下一个事件
event = xmlPullParser.next();
}
}
}

STAX的快速入门

为什么 STAX 解析方式 效率 好于 SAX ?
1、SAX 无选择性的,所有事件都会处理 解析方式,Stax 由用户控制需要处理事件类型
2、在使用Stax进行数据解析时,随时终止解析

Pull 解析器 生成 xml 文档功能 ---- 通过 XmlSerializer 生成 xml 文档
解析xml : 文档开始、元素开始、文本元素、元素结束、文档结束
生成xml :生成文档声明(文档开始),元素开始、文本内容、元素结束 、文档结束
1、生成简单xml
2、通过对象数据生成xml
3、通过对象List数据生成xml

在程序中抽取两个方法 ----- 1. xml --- List对象 2. List对象生成xml

 package com.shellway.javase;

 import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;
import com.shellway.domain.Company; public class demo4 {
/**
* 按照多个对象生成XML文档
* @throws Exception
*/
@Test
public void demo3() throws Exception{
List<Company> companies = new ArrayList<Company>();
Company company = new Company();
company.setName("shellway");
company.setPnum(200);
company.setAddress("深圳西丽");
Company company2 = new Company();
company2.setName("Jerry");
company2.setPnum(500);
company2.setAddress("深圳西丽");
companies.add(company);
companies.add(company2); XmlSerializer xmlSerializer = XmlPullParserFactory.newInstance().newSerializer();
xmlSerializer.setOutput(new FileOutputStream("xml/company.xml"), "utf-8");
xmlSerializer.startDocument("utf-8", true); xmlSerializer.startTag(null, "companies"); for (Company c : companies) {
xmlSerializer.startTag(null, "company"); xmlSerializer.startTag(null, "name");
xmlSerializer.text(c.getName());
xmlSerializer.endTag(null, "name"); xmlSerializer.startTag(null, "pnum");
xmlSerializer.text(c.getPnum()+"");
xmlSerializer.endTag(null, "pnum"); xmlSerializer.startTag(null, "address");
xmlSerializer.text(c.getAddress());
xmlSerializer.endTag(null, "address"); xmlSerializer.endTag(null, "company");
}
xmlSerializer.endTag(null, "companies");
xmlSerializer.endDocument();
} /**
* 按照一个对象生成XML文档
* @throws Exception
*/
@Test
public void demo2() throws Exception{
Company company = new Company();
company.setName("shellway");
company.setPnum(200);
company.setAddress("深圳西丽"); XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
XmlSerializer xmlSerializer = xmlPullParserFactory.newSerializer(); xmlSerializer.setOutput(new FileOutputStream("xml/company.xml"), "utf-8");
xmlSerializer.startDocument("utf-8", true); xmlSerializer.startTag(null, "company"); xmlSerializer.startTag(null, "name");
xmlSerializer.text(company.getName());
xmlSerializer.endTag(null, "name"); xmlSerializer.startTag(null, "pnum");
xmlSerializer.text(company.getPnum()+"");
xmlSerializer.endTag(null, "pnum"); xmlSerializer.startTag(null, "address");
xmlSerializer.text(company.getAddress());
xmlSerializer.endTag(null, "address"); xmlSerializer.endTag(null, "company");
xmlSerializer.endDocument();
} /**
* 生成简单的XML文档
* @throws Exception
*/
@Test
public void testXmlSerializer() throws Exception{
XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
XmlSerializer xmlSerializer = xmlPullParserFactory.newSerializer(); //设置序列化输出文档
//第二个参数是保存的编码
xmlSerializer.setOutput(new FileOutputStream("xml/company.xml"), "utf-8");
//开始文档
//第二个参数为查看的编码,第二个参数为文档是否是alone
xmlSerializer.startDocument("utf-8", true);
//开始元素
xmlSerializer.startTag(null, "name");//第一个参数为名称空间,若没有则 ""或者null
//文本内容
xmlSerializer.text("我们的公司");
//结束元素
xmlSerializer.endTag(null, "name");
//结束文档
xmlSerializer.endDocument();
}
}

按照对象生成xml文档

对内存中List进行CURD操作

     @Test
public void demo5() throws Exception{
List<Company> list = new ArrayList<Company>();
Company company = null;
XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser(); xmlPullParser.setInput(new FileInputStream("xml/company.xml"), "utf-8");
int event;
while((event=xmlPullParser.getEventType())!=XmlPullParser.END_DOCUMENT){ if(event==XmlPullParser.START_TAG&&xmlPullParser.getName().equals("name")){
company = new Company();//注意这句不能放在外面,因为有空文本,结果将是空对象
company.setName(xmlPullParser.nextText());
}
if(event==XmlPullParser.START_TAG&&xmlPullParser.getName().equals("pnum")){
company.setPnum(Integer.parseInt(xmlPullParser.nextText()));
}
if(event==XmlPullParser.START_TAG&&xmlPullParser.getName().equals("address")){
company.setAddress(xmlPullParser.nextText());
}
if (event==XmlPullParser.END_TAG&&xmlPullParser.getName().equals("company")) {
list.add(company);
}
xmlPullParser.next();
}
for (Company c : list) {
System.out.println(c.getName());
System.out.println(c.getPnum());
System.out.println(c.getAddress());
System.out.println("---------------------------------------");
} }

将xml数据通过pull解析器生成List集合

 package com.shellway.domain;

 import java.util.List;
import org.junit.Test; public class XmlCURD {
//删除数据
@Test
public void testDeleteFromXml() throws Exception{
List<Company> companies = PullUtils.getDataForXml("xml/company_bak.xml");
for (Company c : companies) {
if(c.getName().equals("Jerry")){
companies.remove(c);
//因为forech不允许改变长度,所以删了要一个break,且只能删除一个
break;
}
}
//回写
PullUtils.setOutputForXml(companies, "xml/company_bak.xml");
} //修改:要求名为shellway的公司人数增加到200%
@Test
public void testModifyFromXml() throws Exception{
List<Company> companies = PullUtils.getDataForXml("xml/company.xml");
for (Company c : companies) {
if(c.getName().equals("shellway")){
c.setPnum(c.getPnum()*2);
}
}
//回写
PullUtils.setOutputForXml(companies, "xml/company_bak.xml");
} //增加数据
@Test
public void testAddFromXml() throws Exception{
//获取XML中的数据在内存中存放到List
List<Company> companies = PullUtils.getDataForXml("xml/company.xml");
Company company = new Company();
company.setName("kkk");
company.setPnum(1000);
company.setAddress("南山区");
companies.add(company);
//回写
PullUtils.setOutputForXml(companies, "xml/company_bak.xml");
}
//读取数据
@Test
public void testReadFromXml() throws Exception{
List<Company> companies = PullUtils.getDataForXml("xml/company.xml");
for (Company company : companies) {
System.out.println(company.getName());
System.out.println(company.getPnum());
System.out.println(company.getAddress());
System.out.println("--------------------------");
}
} @Test
public void testPull() throws Exception{
List<Company> companies = PullUtils.getDataForXml("xml/company.xml");
PullUtils.setOutputForXml(companies, "xml/company_bak.xml");
}
}

通过pull完成xml的CURD

作业:
1、整理 DOM 、SAX 、STAX 原理和区别
2、编写商品xml文件 --- 通过JAXP DOM 完成CURD操作
3、编写SAX运行案例 ----- 了解
4、编写商品XML文件 --- 通过Pull解析器完成 CURD操作 ---- 重点 xml2List list2xml 两个方法

java攻城狮之路--复习xml&dom_pull编程续的更多相关文章

  1. java攻城狮之路--复习xml&dom_pull编程

    xml&dom_pull编程: 1.去掉欢迎弹窗界面:在window项的preferences选项中输入“configuration center” 找到这一项然后     把复选框勾去即可. ...

  2. java攻城狮之路--复习JDBC(数据库连接池 : C3P0、DBCP)

    复习数据库连接池 : C3P0.DBCP 1.数据库连接池技术的优点: •资源重用:      由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销.在减少系统消耗的基础上,另一方面也增 ...

  3. java攻城狮之路--复习JDBC

    1.JDBC中如何获取数据库链接Connection? Driver 是一个接口: 数据库厂商必须提供实现的接口. 能从其中获取数据库连接. 可以通过 Driver 的实现类对象获取数据库连接. 1. ...

  4. java攻城狮之路--复习JDBC(利用BeanUtils、JDBC元数据编写通用的查询方法;元数据;Blob;事务;批量处理)

    1.利用BeanUtils的前提得要加入以下两个jar包: commons-beanutils-1.8.0.jar commons-logging-1.1.1.jar package com.shel ...

  5. java攻城狮之路--复习JDBC(PrepareStatement)

    PreparedStatement: 1.可以通过调用 Connection 对象的 preparedStatement() 方法获取 PreparedStatement 对象 2.PreparedS ...

  6. java攻城狮之路(Android篇)--BroadcastReceiver&Service

    四大组件:activity 显示. contentProvider 对外暴露自己的数据给其他的应用程序.BroadcastReceiver 广播接收者,必须指定要接收的广播类型.必须明确的指定acti ...

  7. java攻城狮之路(Android篇)--Activity生命

    一:Activity的激活 1.写一个类 extends Activity Activity是android的四大组件之一.Activity的激活分为显式意图激活和隐式意图激活.如果一个activit ...

  8. java攻城狮之路(Android篇)--与服务器交互

    一.图片查看器和网页源码查看器 在输入地址的是不能输入127.0.0.1 或者是 localhost.ScrollView :可以看成一个滚轴 可以去包裹很多的控件在里面 练习1(图片查看器): pa ...

  9. java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单

    一.widget:桌面小控件1 写一个类extends AppWidgetProvider 2 在清单文件件中注册: <receiver android:name=".ExampleA ...

随机推荐

  1. HDU1530(最大团)

    Given a graph G(V, E), a clique is a sub-graph g(v, e), so that for all vertex pairs v1, v2 in v, th ...

  2. fast recovery area

    First of all, the version of my enviroment is Oracle 11.0.2.3. The fast recovery area used to be cal ...

  3. Qt移动应用开发(二):使用动画框架

    Qt移动应用开发(二):使用动画框架 上一篇博客介绍了怎样使用Qt的QML来对屏幕分辨率大小进行适应,其实,不同分辨率的适应是一个很棘手的问题,除了分辨率不同外,宽高比(aspect ratio)也不 ...

  4. excel 补全全部空格

    首先全选列或者选中某列,按F5键.再按"定位条件„"button,选择空值,这样就把全部列的空格选中了,然后直接输入"你想要替换的值",再按Ctrl + 回车

  5. Apache配置基于域名的虚拟主机

    一.设定 模拟域名  www.wang.org.blog.wang.org.bbs.wang.org 网站文件夹 /var/html/www./var/html/blog./var/html/bbs ...

  6. 用BOOST_FOREACH简化遍历操作

    BOOST_FOREACH能够方便的遍历STL容器. 仅仅须要头文件: #include <boost/foreach.hpp> 然后遍历容器vector/list/set/deque/s ...

  7. Android开发之使用sqlite3工具操作数据库的两种方式

    使用 sqlite3 工具操作数据库的两种方式 请尊重他人的劳动成果,转载请注明出处:Android开发之使用sqlite3工具操作数据库的两种方式 http://blog.csdn.net/feng ...

  8. 微信前端js sdk以外的开发

    此时页面中就会出现刚才我画红圈部分的工具条. 这个工具条再加上上面的标题栏工具条. 极大的降低了可视区域的面积. 是否能将它去掉呢?答案是能够的.增加以下代码就能够去掉微信中以下的工具条: docum ...

  9. GammaRay观察Qt程序的运行状况

    GammaRay是KDAB开发的Qt应用程序的软件内省工具.利用QObject内省机制,它允许您在运行时观察和操作应用程序.这既可以在工作站本地使用,也可以在嵌入式目标上远程使用. 通过扩充指令级调试 ...

  10. Jboss 7配置日志

    1. Jboss7配置日志理论知识介绍 Jboss 7日志能够在XML配置文件和日志管理属性文件内配置.默认日志配置在configuration文件夹的logging.properties文件内. 通 ...