ch2 XML

SAX解析器

SAXParserFactory factory = SAXParserFactory.newInstance();

SAXParser parser = factory.newSAXParser();    //建立SAX解析器对象

parser.parse(source,handler);  //source可以是文件,URL或者字符串输入流,handle是DefaultHandler的子类

DefaultHandler handler = new
DefaultHandler(){
public void startElement(String namespaceURI,String lname,String qname, Attributes attrs) throws SAXException{
if(lname.equalsIngoreCase("a")&&attrs!=null){
for(int i=0;i<attrs.getLength();i++){
String aname = attrs.getLocalName(i);
if(aname.equalsIgnoreCase("href"))
System.out.println(attrs.getValue(i));
}
}
}
};

其中qname参数是prefix:localname这种形式。如果命名空间处理特性打开,那么namespaceURI和lname描述的就是命名空间和本地(非限定)名。
与DOM一样,命名空间默认是关闭的,调用工厂类的setNamespaceAware方法激活:

SAXParserFactory factory = SAXParserFactory.newInstnce();

factory.setNamespaceAware(true);

SAXParser saxParser = factory.newSAXParser();

备注:XHTML文件总是以一个DTD引用标签开头,W3C也不情愿提供千万亿次的下载,如果自己不需要验证文件,只需调用:

factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd",false);

StAX解析器

3 import java.io.*;
4 import java.net.*;
5 import javax.xml.parsers.*;
6 import org.xml.sax.*;
7 import org.xml.sax.helpers.*;
89
/**
10 * This program demonstrates how to use a SAX parser. The program prints all hyperlinks of an
11 * XHTML web page.<br>
12 * Usage: java SAXTest url
13 * @version 1.00 2001-09-29
14 * @author Cay Horstmann
15 */
16 public class SAXTest
17 {
18 public static void main(String[] args) throws Exception
19 {
20 String url;
21 if (args.length == 0)
22 {
23 url = "http://www.w3c.org";
24 System.out.println("Using " + url);
25 }
26 else url = args[0];
27
28 DefaultHandler handler = new DefaultHandler()
29 {
30 public void startElement(String namespaceURI, String lname, String qname,
31 Attributes attrs)
32 {
33 if (lname.equals("a") && attrs != null)
34 {
35 for (int i = 0; i < attrs.getLength(); i++)
36 {
37 String aname = attrs.getLocalName(i);
38 if (aname.equals("href")) System.out.println(attrs.getValue(i));
39 }
40 }
41 }
42 };
43
44 SAXParserFactory factory = SAXParserFactory.newInstance();
45 factory.setNamespaceAware(true);
46 factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd",
false);
47 SAXParser saxParser = factory.newSAXParser();
48 InputStream in = new URL(url).openStream();
49 saxParser.parse(in, handler);
50 }
51 }

生成XML

不带命名空间的文档:

Document doc = builder.newDocument();  //创建一个空文档

Element rootElement = doc.createElement(rootName);  //创建文档元素

Element childElement = doc.createElement(childName);

Text textNode = doc.createTextNode(textContents);  //创建文本节点

doc.appendChild(rootElement);   //创建跟节点

rootElement.appendChild(childElement);  //创建子节点

childElement.appendChild(textNode);   //创建文本值

rootElement.setAttribute(name,value);  //创建元素属性

带命名空间的文档:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

factory.setNamespaceAware(true);

builder = factory.newDocumentBuilder();

String namespace = "http://www.w3.org/2000/svg";

Element rootElement = doc.createElementNS(namespace,"svg"); //创建文档元素

Element svgElement = doc.createElement(namespace,"svg:svg");  //带命名空间前缀的写法

rootElement.setAttributeNS(namespace,qualifiedName,value);

----------------------------------------------------------------

XML DOM输出
方式1

Transformer t = TransformerFactory.newInstance().newTransformer();   //这玩意干嘛的?从源到结果的转换API

t.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM,systemIdentifier);

t.setOutputProperty(Outputkeys.DOCTYPE_SYSTEM,publicIdentifier);

t.setOutputProperty(OutputKeys.INDENT,"yes");

t.setOutputProperty(OutputKeys.METHOD,"xml");

t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount","2");

t.transform(new DOMSource(doc),new StreamResult(new FileOutputStream(file)));  //执行上面的设置并且输出到文件中

方式2 LSSerializer

DOMImplementation impl = doc.getImplementation();

DOMImplementationLS implLS = (DOMImplementationLS) impl.getFeature("LS","3.0");

LSSerializer ser = implLS.createLSSerializer();

ser.getDomConfig().setParameter("format-pretty-print",true);  //设置空格和换行

String str = ser.writeToString(doc);  //将文档转换为字符串

LSOutput out = implLS.createLSOutput();

out.setEncoding("UTF-8");

out.setByteStream(Files.newOutputStream(path));

ser.write(doc,out);  //将输出写入文件中

方式3 StAX

XMLOutputFactory factory = XMLOutputFactory.newInstance();

XMLStreamWriter writer = factory.createXMLStreamWriter(out);

接着是一系列的按XML顺序从上到下的操作,如:

产生XML文件头  writer.writeStartDocument();

添加子节点  writer.writeStartElement(name);

...

Java核心技术II读书笔记(三)的更多相关文章

  1. Java核心技术II读书笔记(一)

    Char2 XML 解析器:读入一个文件,确认其具有正确的格式,然后将其分解成各种元素,使程序员能够访问这些元素. java库提供了两种XML解析器:DOM和SAX,即文档对象模型和流机制解析器. D ...

  2. Java核心技术II读书笔记(二)

    ch2 XML 有两种XML文档结构,DTD和Schema,用解释文档构成规则,这些规则指定了每个元素俺的合法子元素和属性. DTD DTD有多种提供方式,可以像下面这样加到XML中: <?xm ...

  3. java编程思想读书笔记三(11-21)

    十一:持有对象 >持有对象实例 ●数组将数字与对象联系起来.它保存类型明确的对象,查询对象时,不需要对结果做类型转换.他可以是多维的. 可以保存基本的数据类型.但是,数组一旦生成,容量就不会在变 ...

  4. 深入理解Java虚拟机之读书笔记三 内存分配策略

    一般的内存分配是指堆上的分配,但也可能经过JIT编译后被拆散为标量类型并间接地在栈上分配.对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配,少数情况下直接分 ...

  5. 《Java核心技术》 -- 读书笔记 ② - 类 | 对象 | 接口

    对象vs对象变量 “对象” 描述的是一个类的具体实例,他被java虚拟机分配在 "堆" (Heap)中. “对象变量” 为一个对象的引用(对象变量的值=记载着具体对象的位置/地址) ...

  6. 《Java核心技术》 -- 读书笔记 ① - 预热

    引言 之前通过网上的实例自己使用了Java的一些技术及轮子快速的的“烂“造了一些小应用,但是毕竟没有认真地了解和认知Java,遂打算花一个月左右的时间来细细品味一下... 从头开始,慢慢深入!! Ja ...

  7. Java逍遥游记读书笔记<三>

    异常处理 如何判断一个方法中可能抛出异常 该方法中出现throw语句 该方法调用了其他已经带throws子句的方法. 如果方法中可能抛出异常,有两种处理方法: 1.若当前方法有能力处理异常,则用Try ...

  8. 《深入理解java虚拟机》读书笔记三——第四章

    第四章 虚拟机性能监控与故障处理工具 1.JDK命令行工具 jps命令: 作用:列出正在运行的虚拟机进程. 格式:jps [option] [hostid] 选项:-q 只输出LVMID(Local ...

  9. 《深入理解Java虚拟机》读书笔记三

    第四章 虚拟机性能监控与故障处理工具 1.JDK命令行工具 jps命令: 作用:列出正在运行的虚拟机进程. 格式:jps [option] [hostid] 选项:-q 只输出LVMID(Local ...

随机推荐

  1. poj 2599 A funny game 博弈论

    思路:无向图,走过的点不能在走.dfs搞定…… 再就是后继中有必败点的为必胜点! 代码如下: #include<iostream> #include<cstdio> #incl ...

  2. tomcat下context.xml中JNDI数据源配置

    jndi(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API.命名服务将名称和对象联系起来,使得我们可以用 ...

  3. Javascript 数组循环遍历之forEach

    1.  js 数组循环遍历. 数组循环变量,最先想到的就是 for(var i=0;i<count;i++)这样的方式了. 除此之外,也可以使用较简便的forEach 方式   2.  forE ...

  4. JSTL Tag学习笔记(一)之<c: />

    注:本文中的例子主要来自http://www.tutorialspoint.com/jsp/jsp_standard_tag_library.htm.  ======================= ...

  5. 纯CSS实现的右侧底部简洁悬浮效果

    我们见过很多页面右侧浮动效果,最早有QQ联系面板,对联广告等,大多数都是基于Javascript实现的动态效果,今天我给大家分享一个只需要CSS结合DIV实现的右侧浮动效果. HTML 我们希望悬浮效 ...

  6. unbuntu下vnc和vnc2swf的使用

    安装:sudo apt-get install vnc4server,vncviewer 默认vnc2swf安装了的. pyvnc2swf的说明文档:http://www.unixuser.org/~ ...

  7. wordpress安装,创建配置文件无反应

    wordpress安装时,点击“创建配置文件”无反应,可以手动创建wp-config.php, 打开wp-config-sample.php,配置相关信息,然后将文件改名为wp-config.php上 ...

  8. 几百万的数据,mysql快速高效创建索引

    有一个问题,一张表有3百万条记录,随着时间的增加,记录量会更多,此时查询速度很慢.在创建此表前没有未相应字段添加索引,所以此时需要为表添加索引.但是因为数据量大的原因,索引添加不成功,想了很多办法,终 ...

  9. ubuntu12.10升级至14.04

    之前执行apt-get 不管是什么软件或apt-get update都会遇到fail to fetch http://us.archive.ubuntu.com quantal-updates/mai ...

  10. Eclipse插件安装与使用 —— Properties Editor

    一.下载     首先当然是下载插件啦! 下载地址:http://sourceforge.jp/projects/propedit/downloads/40156/jp.gr.java_conf.us ...