java攻城狮之路--复习xml&dom_pull编程续
本章节我们要学习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编程续的更多相关文章
- java攻城狮之路--复习xml&dom_pull编程
xml&dom_pull编程: 1.去掉欢迎弹窗界面:在window项的preferences选项中输入“configuration center” 找到这一项然后 把复选框勾去即可. ...
- java攻城狮之路--复习JDBC(数据库连接池 : C3P0、DBCP)
复习数据库连接池 : C3P0.DBCP 1.数据库连接池技术的优点: •资源重用: 由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销.在减少系统消耗的基础上,另一方面也增 ...
- java攻城狮之路--复习JDBC
1.JDBC中如何获取数据库链接Connection? Driver 是一个接口: 数据库厂商必须提供实现的接口. 能从其中获取数据库连接. 可以通过 Driver 的实现类对象获取数据库连接. 1. ...
- java攻城狮之路--复习JDBC(利用BeanUtils、JDBC元数据编写通用的查询方法;元数据;Blob;事务;批量处理)
1.利用BeanUtils的前提得要加入以下两个jar包: commons-beanutils-1.8.0.jar commons-logging-1.1.1.jar package com.shel ...
- java攻城狮之路--复习JDBC(PrepareStatement)
PreparedStatement: 1.可以通过调用 Connection 对象的 preparedStatement() 方法获取 PreparedStatement 对象 2.PreparedS ...
- java攻城狮之路(Android篇)--BroadcastReceiver&Service
四大组件:activity 显示. contentProvider 对外暴露自己的数据给其他的应用程序.BroadcastReceiver 广播接收者,必须指定要接收的广播类型.必须明确的指定acti ...
- java攻城狮之路(Android篇)--Activity生命
一:Activity的激活 1.写一个类 extends Activity Activity是android的四大组件之一.Activity的激活分为显式意图激活和隐式意图激活.如果一个activit ...
- java攻城狮之路(Android篇)--与服务器交互
一.图片查看器和网页源码查看器 在输入地址的是不能输入127.0.0.1 或者是 localhost.ScrollView :可以看成一个滚轴 可以去包裹很多的控件在里面 练习1(图片查看器): pa ...
- java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单
一.widget:桌面小控件1 写一个类extends AppWidgetProvider 2 在清单文件件中注册: <receiver android:name=".ExampleA ...
随机推荐
- 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 ...
- 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 ...
- Qt移动应用开发(二):使用动画框架
Qt移动应用开发(二):使用动画框架 上一篇博客介绍了怎样使用Qt的QML来对屏幕分辨率大小进行适应,其实,不同分辨率的适应是一个很棘手的问题,除了分辨率不同外,宽高比(aspect ratio)也不 ...
- excel 补全全部空格
首先全选列或者选中某列,按F5键.再按"定位条件„"button,选择空值,这样就把全部列的空格选中了,然后直接输入"你想要替换的值",再按Ctrl + 回车
- Apache配置基于域名的虚拟主机
一.设定 模拟域名 www.wang.org.blog.wang.org.bbs.wang.org 网站文件夹 /var/html/www./var/html/blog./var/html/bbs ...
- 用BOOST_FOREACH简化遍历操作
BOOST_FOREACH能够方便的遍历STL容器. 仅仅须要头文件: #include <boost/foreach.hpp> 然后遍历容器vector/list/set/deque/s ...
- Android开发之使用sqlite3工具操作数据库的两种方式
使用 sqlite3 工具操作数据库的两种方式 请尊重他人的劳动成果,转载请注明出处:Android开发之使用sqlite3工具操作数据库的两种方式 http://blog.csdn.net/feng ...
- 微信前端js sdk以外的开发
此时页面中就会出现刚才我画红圈部分的工具条. 这个工具条再加上上面的标题栏工具条. 极大的降低了可视区域的面积. 是否能将它去掉呢?答案是能够的.增加以下代码就能够去掉微信中以下的工具条: docum ...
- GammaRay观察Qt程序的运行状况
GammaRay是KDAB开发的Qt应用程序的软件内省工具.利用QObject内省机制,它允许您在运行时观察和操作应用程序.这既可以在工作站本地使用,也可以在嵌入式目标上远程使用. 通过扩充指令级调试 ...
- Jboss 7配置日志
1. Jboss7配置日志理论知识介绍 Jboss 7日志能够在XML配置文件和日志管理属性文件内配置.默认日志配置在configuration文件夹的logging.properties文件内. 通 ...