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

时间:2022-08-31 14:33:06

Char2 XML

解析器:读入一个文件,确认其具有正确的格式,然后将其分解成各种元素,使程序员能够访问这些元素。

java库提供了两种XML解析器:DOM和SAX,即文档对象模型和流机制解析器。

DOM不适合处理太长的XML,考虑到内存的消耗。

如果只对XML中的某些元素感兴趣,而不关心上下文,考虑用SAX。

DOM解析器的接口已经被W3C标准化了,org.w3c.dom包中包含了这些接口类型的定义,比如Document和Element等。不同的组织都提供了实现这些接口的DOM解析器,如Apache和IBM。我们可以通过JAXP(Java API for XML Processing)库以插件的方式使用这些解析器中的任意一个。JDK本身也有自己的DOM解析器。本章就使用这个。所以,我们只要通过实现以上的接口或类就能达到使用解析器的目的。

以下是读入一个XML文档的方式:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder = factory.newDocumentBuilder();  //这个就是解析器对象啦

书里说了三种XML的来源,File、URL、InputStream:

FIle f = ...

Document doc = builder.parse(f);

URL u = ...

Document doc = builder.parse(u);

InputStream in = ...

Document doc = builder.parse(in);

需要注意的是,如果以InputStream为输入源,当XML中有用到DTD等以该XML的位置为相对路径的引用时,解析器将无法定位这个DTD等文档。需要安装一个“实体解析器”(entity resolver)来解决这个问题。

接下来就是解析Document对象各个部分的事了,具体看这个图:

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

例如,处理下面的文档:

<?xml version="1.0"?>

<font>

<name>Zhangsan</name>

<size>33</size>

</font>

Element root = doc.getDocumentElement();  //返回根元素font

root.getTagName();   //返回字符串"font"

获得该元素的子元素:

NodeList children = root.getChildNodes();

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

Node child = children.item(i);

...

}

其中,getLength()=5而不是2,为啥?因为子元素与主元素之间、子元素与子元素之间空格也算了。如果只希望得到子元素,可以这样处理:

NodeList children = root.getChildNodes();

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

Node child = children.item(i);

if(child instanceof Element){

Element childElement = (Element)child;

...

}

}

这样处理还是很麻烦的,这就是为啥后面要引入DTD的原因了,DTD能后对XML的内容进行规范处理,减少一些不必要的验证过程。

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

我们看上面的图,其中包括空白子元素,是Text类型的,另外,发现没?name和size的值也是Text类型的,所以,怎么样获得Zhangsan、33这两个值呢?自然通过Text类型的对象来处理:

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

Node child = children.item(i);

if(child instanceof Element){

Element childElement = (Element) child;

Text textNode = (Text) childElement.getFirstChild();

String text = textNode.getData().trim();

if(childElement.getTagName().equals("name")){

name = text;

}else if(childElement.getTagName().equals(size")){

size = Integer.parseInt(text);

}

}

}

上面用到trim()是为了避免下面格式产生的空格:

<size>

33

</size>

这种情况下,解析器会把所有的换行符和空格都包含到Text中去。

最后一部分是获取XML中元素属性对象,直接上代码:

NameNodeMap attributes = element.getAttributes();

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

  Node attribute = attributes.item(i);

  String name = attribute.getNodeName();    //属性名

  String value = attribute.getNodeValue();     //属性值

}

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

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

    ch2 XML SAX解析器 SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory ...

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

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

  3. 《Java核心技术》 -- 读书笔记 ② - 类 &vert; 对象 &vert; 接口

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

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

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

  5. 《深入java虚拟机》读书笔记之垃圾收集器与内存分配策略

    前言 该读书笔记用于记录在学习<深入理解Java虚拟机--JVM高级特性与最佳实践>一书中的一些重要知识点,对其中的部分内容进行归纳,或者是对其中不明白的地方做一些注释.主要是方便之后进行 ...

  6. JAVA编程思想读书笔记(五)--多线程

    接上篇JAVA编程思想读书笔记(四)--对象的克隆 No1: daemon Thread(守护线程) 参考http://blog.csdn.net/pony_maggie/article/detail ...

  7. JAVA编程思想读书笔记(四)--对象的克隆

    接上篇JAVA编程思想读书笔记(三)--RTTI No1: 类的克隆 public class MyObject implements Cloneable { int i; public MyObje ...

  8. JAVA编程思想读书笔记(三)--RTTI

    接上篇JAVA编程思想读书笔记(二) 第十一章 运行期类型判定 No1: 对于作为程序一部分的每个类,它们都有一个Class对象.换言之,每次写一个新类时,同时也会创建一个Class对象(更恰当的说, ...

  9. JAVA编程思想读书笔记(二)--容器

    接上篇JAVA编程思想读书笔记(一) 第八章.对象的容纳 No1: java提供了四种类型的集合类:Vector(矢量).BitSet(位集).Stack(堆栈).Hashtable(散列表) No2 ...

随机推荐

  1. adb 命令集合

    1. adb shell 2. adb version 查看 adb 安装版本 3. adb start-server 启动服务 4. adb kill-server 杀死服务 5. adb get- ...

  2. springAOP实现基于注解的数据源动态切换

    需求 代码实现读写数据库分离 武器 spring3.0以上版本 实现思路 1.继承org.springframework.jdbc.datasource.lookup.AbstractRoutingD ...

  3. 让EDIUS中素材小距离精确移动的教程

    我们在使用EDIUS视频编辑软件编辑视频的时候,发现想要把剪辑好的视频片段做小距离的调整非常的不容易,一不小心手滑就移多了.这个问题是不是很令人烦躁?不过你们看完今天的文章就不会再为这个问题发愁了.本 ...

  4. 二十二、OGNL的一些其他操作

    二十二.OGNL的一些其他操作 投影 ?判断满足条件 动作类代码: ^ $   public class Demo2Action extends ActionSupport {     public ...

  5. Learning Vector

    题意: 给出n组x,y增量,从(0,0)开始以x,y坐标增加后等到的终点坐标,可以构成一个面积,再以这个终点为起点再增加,以此类推,使用增量顺序不同,得到的面积不,求用k组增量能得到的最大的面积. 分 ...

  6. STL容器的效率比较

    1.介绍 顺序存储容器 : string.vector.list.deque 关联存储容器:map底层采用的是树型结构,多数使用平衡二叉树实现,查找某一值是常数时间,遍历起来效果也不错, 只是每次插入 ...

  7. C&num;将数据以XML格式写入Excel

    本文转载:http://www.cnblogs.com/eflylab/archive/2008/09/21/1295580.html c#将数据导入Excel另类方法 今天公司突然给个Excel模版 ...

  8. 单片机C语言编程规范

    一.基本要求 1.1 程序结构清析,简单易懂,单个函数的程序行数不得超过100行. 1.2 打算干什么,要简单,直接了当,代码精简,避免垃圾程序. 1.3 尽量使用标准库函数和公共函数. 1.4 不要 ...

  9. time元素与微格式&sol;pubdate属性

    首先来说下微格式,它是一种利用HTML的class属性来对网页添加诸如新闻事件发生的日期和时间.个人电话号码.企业邮箱之类的附加信息方法. time元素代表24小时中的某个时刻或某个日期,表示时刻时允 ...

  10. 【EMV L2】Application Usage Control

    [Application Usage Control] Tag9F07,卡片数据,2bytes: Indicates issuer’s specified restrictions on the ge ...