本章节我们要学习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. Hackerrank manasa-and-combinatorics(数学推导)

    题意:有n个字符A,2n个字符B,问你能用这3n个字母组成多少种字符串,使得组成的字符串所有前缀与后缀的B的数目都大于等于A的数目,对答案mod 99991 分析:类似卡特兰数 ans=总方案数-存在 ...

  2. Ubuntu 16.04安装FTP客户端filezilla

    1.安装: sudo apt-get install filezilla 参考: http://os.51cto.com/art/201103/247564.htm

  3. IIS: 配置web.config解决Maximum request length exceeded错误

    In system.web <httpRuntime maxRequestLength="1048576" executionTimeout="3600" ...

  4. [JavaEE] Data Validation

    When we create Entity and Respority, we also need to do validations to protect our data. In Java, va ...

  5. 适用于app.config与web.config的ConfigUtil读写工具类 基于MongoDb官方C#驱动封装MongoDbCsharpHelper类(CRUD类) 基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD) C# 实现AOP 的几种常见方式

    适用于app.config与web.config的ConfigUtil读写工具类   之前文章:<两种读写配置文件的方案(app.config与web.config通用)>,现在重新整理一 ...

  6. Weka算法Classifier-meta-AdaBoostM1源代码分析(一)

    多分类器组合算法简单的来讲经常使用的有voting,bagging和boosting,当中就效果来说Boosting略占优势,而AdaBoostM1算法又相当于Boosting算法的"经典款 ...

  7. error: &#39;Can&#39;t connect to local MySQL server through socket &#39;/var/lib/mysql/mysql.sock&#39; (2)&#39;

    [root@luozhonghua ~]#   /usr/bin/mysqladmin -u root password 'aaaaaa' /usr/bin/mysqladmin: connect t ...

  8. cgi程序读取post发送的特殊字符,尤其适合于微信公众平台开发中发送被动消息

    [问题]用c编写cgi程序怎样取出html表单post来的数据? [分析]html表单post来的数据形如username="zhang"&&password=&q ...

  9. 用NuGet安装NewtonSoft.json

    因为要在C#里读取JSON字符串,资料查来查去,发现只能用第三方的NewtonSoft.json.本来.net也有自带的类库可以处理json,但TM的不停要你将JSON读进类对象里面.我靠,我只不过想 ...

  10. MySQL5.6 GTID方式,配置主从

    迁移数据到从库 数据导出: mysqldump -uroot -p111111 -h127. -P3306 -q --single-transaction -R -E --triggers --def ...