JAVA与DOM解析器基础 学习笔记
文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。各种语言可以按照DOM规范给出解析XML文件的解析器。Sun公司发布的JDK1.4的后续版本中提供了解析XML文件的网API(Java API for XML Processing)。关于XML语法请参考这里。为什么没有对java类和实际对象没做详细说明,我已经到代码中写了注释了,到这里就不做过多的说明了。
检测命名空间:TestNameSpace.java
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; /**
* 检查命xml标记的命名空间
* @author licheng
*
*/
public class TestNameSpace {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SAXParserFactory factory=SAXParserFactory.newInstance(); //语法解析器的工厂对象
factory.setNamespaceAware(true); //允许使用命名空间
try {
SAXParser saxParser=factory.newSAXParser(); //获取语法解析器
MyHeader handle=new MyHeader(); //创建输出句柄
saxParser.parse(new File("student.xml"), handle); //开始语法解析 文件放到项目根目录不是WebRoot
} catch (Exception e) { //抛出异常
// TODO Auto-generated catch block
e.printStackTrace();
}
} } /**
* 创建输出句柄对象
* @author Administrator
*
*/
class MyHeader extends DefaultHandler{
@Override //覆盖父类的方法
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if(uri.length()>0)
System.out.println("标记:"+localName+"的命名空间是:"+uri);
else
System.out.println("标记:"+localName+"没有命名空间");
}
}
浏览器中的DOM解析器只检测XML文件是否是规范的,而不能检测XML文件的有效性,此时我们可以使用JAVA提供的DOM解析器来检查一个XML文件的有效性:
TestValidate.java
import java.io.File;
import java.io.IOException;
import java.util.Scanner; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler; /**
* 检查XML文件的有效性
* 浏览器中的XML解析器只检查XML文件是否是规范的,并不检查XML文件是否遵守DTD规定的约束条件。
* 此时就可以使用DOM解析器来检查一个XML文件是否是有效的。
* @author licheng
*
*/
public class TestValidate { public static void main(String[] args) {
String fileName=null;
Scanner reader=new Scanner(System.in);
System.out.print("请输入要验证有效性的XML的文件:");
fileName=reader.nextLine(); //从控制台读取一行数据
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); //DocumentBuilderFactory工厂对象 获取自身实例
factory.setValidating(true); //设置有效性检测为真
try {
DocumentBuilder builer=factory.newDocumentBuilder();//获取DOM解析器
MyHandler handler=new MyHandler(); //创建MyHandler实例
builer.setErrorHandler(handler); // 设置解析器的错误句柄为 MyHandler的实例
Document document=builer.parse(new File(fileName)); //DOM解析器解析 XML文件
if(handler.errorMessage==null){ //判断handler对象是否含有错误信息
System.out.print(fileName+"文件是效的");
}else{
System.out.print(fileName+"文件是无效的");
} } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } } /**
* 创建输出句柄
* @author Administrator
*
*/
class MyHandler extends DefaultHandler{ String errorMessage=null;
/**
* 一般性错误
*/
public void error(SAXParseException e) throws SAXException {
errorMessage=e.getMessage();
System.out.print("一般错误:"+ errorMessage);
} /*
*
* 致命错误 程序终止
*/
public void fatalError(SAXParseException e) throws SAXException {
errorMessage=e.getMessage();
System.out.print("致命错误:"+ errorMessage);
} }
获取XML声明信息,根节点名称,指定节点的信息:JAXPOne.java
import java.io.File;
import java.io.IOException; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException; /**
* JAVA DOM解析器入门
* 输出书籍信息
* @author licheng
*
*/
public class JAXPOne { public static void main(String[] args) {
// DocumentBuilderFactory对象调用newInstance方法实例化一个DocumentBuilderFactory对象
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
try {
//factory对象调用newDocumentBuilder创建 domParser DOM解析器
DocumentBuilder domParser=factory.newDocumentBuilder();
try { Document document=domParser.parse(new File("student.xml"));
String version=document.getXmlVersion(); //获取XML版本号
System.out.println("version:"+version); String encoding=document.getXmlEncoding(); //获取声明编码
System.out.println("encoding:"+encoding); Element root=document.getDocumentElement(); //获取根节点 是先要获取根节点吗
String rootName=root.getNodeName(); //获取节点的名称
System.out.println("rootName:"+rootName);
System.out.println(rootName+"类型为:"+root.getNodeType()); //获取节点类型 dom的级别 NodeList nodelist=root.getElementsByTagName("book"); //获取节点列表
int size=nodelist.getLength();
for(int k=0;k<size;k++){
Node node=nodelist.item(k); //获取节点
String name=node.getNodeName(); //节点名称
String content=node.getTextContent(); //获取内容 包含子孙节点中的文本数据
System.out.println(name+":"+content);
//System.out.println(name+"节点类型:"+node.getNodeType()); //获取节点类型 dom的级别
} } catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }
使用递归方法输出节点中的数据:JAXPTwo.java
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException; /**
* 递归方法输出节点中的数据
* @author licheng
*
*/
public class JAXPTwo { /**
*主函数
*/
public static void main(String[] args) {
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
try {
DocumentBuilder domParser=factory.newDocumentBuilder(); Document document=domParser.parse(new File("bookinfo.xml"));
NodeList nodeList=document.getChildNodes();
output(nodeList);
} catch (Exception e) {
e.printStackTrace();
} } /**
* 递归输出节点数据
* @param nodelist 节点列表
*/
public static void output(NodeList nodelist){
int size=nodelist.getLength(); //获取接点列表的长度
for(int k=0;k<size;k++){
Node node=nodelist.item(k); //获取节点列表中的一项
if(node.getNodeType()==node.TEXT_NODE){ //节点类型为TEXT
Text textNode=(Text)node;
String content=textNode.getWholeText();
System.out.print(content);
}
if(node.getNodeType()==Node.ELEMENT_NODE){ //节点类型为ELEMENT
Element elementNode=(Element)node;
String name=elementNode.getNodeName();
System.out.print(name);
NodeList nodes=elementNode.getChildNodes();
output(nodes); //递归掉用该方法
}
} } }
输出Text节点信息,统计一共有多少个Text文本节点:JAXPText.java
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException; /**
* 统计一共有多少个Text节点
* @author licheng
*
*/
public class JAXPText { /**
*主函数
*/
public static void main(String[] args) {
GiveData give=new GiveData();
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
try {
DocumentBuilder domParser=factory.newDocumentBuilder(); Document document=domParser.parse(new File("bookinfo.xml"));
NodeList nodeList=document.getChildNodes();
give.output(nodeList);
System.out.println("一共有"+give.m+"个Text节点");
} catch (Exception e) {
e.printStackTrace();
} } } class GiveData{
int m=0; //text的个数
public void output(NodeList nodelist){
int size=nodelist.getLength(); //获取接点列表的长度
for(int k=0;k<size;k++){
Node node=nodelist.item(k); //获取节点列表中的一项
if(node.getNodeType()==node.TEXT_NODE){ //节点类型为TEXT
Text textNode=(Text)node;
String content=textNode.getWholeText();
m++;
System.out.print(content);
}
if(node.getNodeType()==Node.ELEMENT_NODE){ //节点类型为ELEMENT
Element elementNode=(Element)node;
String name=elementNode.getNodeName();
System.out.print(name);
NodeList nodes=elementNode.getChildNodes();
output(nodes); //递归掉用该方法
}
} }
}
获取Attr属性节点信息:JAXPAttr.java
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException; /**
* 遍历属性节点信息
* @author licheng
*
*/
public class JAXPAttr { /**
*主函数
*/
public static void main(String[] args) {
GiveData3 give=new GiveData3(); try {
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
factory.setIgnoringElementContentWhitespace(true); //忽略空白缩进
DocumentBuilder domParser=factory.newDocumentBuilder();
Document document=domParser.parse(new File("student.xml"));
Element root=document.getDocumentElement();
NodeList nodeList=root.getChildNodes();
give.output(nodeList); } catch (Exception e) {
e.printStackTrace();
} } } class GiveData3{ public void output(NodeList nodelist){
int size=nodelist.getLength(); //获取接点列表的长度
for(int k=0;k<size;k++){
Node node=nodelist.item(k); //获取节点列表中的一项
if(node.getNodeType()==node.TEXT_NODE){ //节点类型为TEXT
Text textNode=(Text)node;
String content=textNode.getWholeText();
System.out.print(content);
}
if(node.getNodeType()==Node.ELEMENT_NODE){ //节点类型为ELEMENT
Element elementNode=(Element)node;
String name=elementNode.getNodeName();
System.out.print(name);
NamedNodeMap map=elementNode.getAttributes(); //获取属性节点集合
/**
* 属性节点操作
*/
for(int m=0;m<map.getLength();m++){
Attr attrNode=(Attr)map.item(m);
String attrName=attrNode.getName(); //属性名称
String attrValue=attrNode.getValue(); //属性值
System.out.print(" "+attrName+"="+attrValue);
}
NodeList nodes=elementNode.getChildNodes();
output(nodes); //递归掉用该方法
}
} }
}
忽略文本空白:JAXPEight.java
import java.io.IOException; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException; public class JAXPEight { public static void main(String[] args) {
GiveD give=new GiveD();
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
factory.setIgnoringElementContentWhitespace(true); //这个确实是可行的吗??
try {
DocumentBuilder domPaser=factory.newDocumentBuilder();
Document document=domPaser.parse("student.xml");
Element root=document.getDocumentElement();
NodeList nodeList=root.getChildNodes(); give.output(nodeList); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} } class GiveD{
int m=0;
public void output(NodeList nodeList){
int size=nodeList.getLength();
for(int k=0;k<size;k++){
Node node=nodeList.item(k);
if(node.getNodeType()==Node.TEXT_NODE){
Text textNode=(Text)node;
String content=textNode.getWholeText();
m++;
System.out.print(content);
}
if(node.getNodeType()==Node.ELEMENT_NODE){
Element elementNode=(Element)node;
String name=elementNode.getNodeName();
System.out.print(" ");
NodeList nodes=elementNode.getChildNodes();
output(nodes);
}
}
} }
[使用DOM生成XML文件]此类通过已经存在的文件 获取Document对象 修改DOM后 创建XML文件:JAXPTransformer.java
import java.io.File;
import java.io.FileOutputStream; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList; /**
* 通过已经存在的文件 获取Document对象
* 修改DOM后
* DOM创建XML文件
* @author licheng
*
*/
public class JAXPTransformer {
public static void main(String[] args) { ModifyNode modify=new ModifyNode();
try {
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
factory.setIgnoringElementContentWhitespace(true); //忽略空白缩进
DocumentBuilder domParser=factory.newDocumentBuilder();
Document document=domParser.parse(new File("mobileNumber.xml")); //通过已经存在的文件创建Document对象
Element root=document.getDocumentElement();
NodeList nodeList=root.getChildNodes();
modify.modifyNode(nodeList, document); //调用修改DOM的方法
TransformerFactory transFactory=TransformerFactory.newInstance(); //工厂对象获取transFactory实例
Transformer transformer=transFactory.newTransformer(); //获取Transformer实例
DOMSource domSource=new DOMSource(document);
File file=new File("newXML.xml");
FileOutputStream out=new FileOutputStream(file);
StreamResult xmlResult=new StreamResult(out);
transformer.transform(domSource, xmlResult); out.close();
} catch (Exception e) {
e.printStackTrace();
} }
}
class ModifyNode{
int m=0;
Document document;
public void modifyNode(NodeList nodeList,Document document){
this.document=document;
int size=nodeList.getLength();
for(int k=0;k<size;k++){
Node node=nodeList.item(k);
if(node.getNodeType()==Node.ELEMENT_NODE){
Element elementNode=(Element)node; //这里获取节点
String name=elementNode.getNodeName();//节点名称
if(name.equals("用户")){ //节点判断
m++;
Node textN=document.createTextNode("80元"); //创建文本节点
Node elementN=document.createElement("月租费"); //穿件节点
elementN.appendChild(textN);
elementNode.appendChild(elementN);
}
NodeList nodes=elementNode.getChildNodes();
modifyNode(nodes, document); //此处递归
}
} } }
[使用DOM生成XML文件]上例中通过已有的XML文件产生一个Document对象,而本例直接 调用 newDocument()方法获取对象。
JAXPTransformer2.java
import java.io.File;
import java.io.FileOutputStream; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList; /**
* domPaser 调用 newDocument() 方法获取Document对象
* 然后为Document节点添加子孙节点
* 使用Transformer生成一个新的XML文件
* @author licheng
*
*/
public class JAXPTransformer2 {
public static void main(String[] args) {
try {
String[] personName={"张三","李四","王五"};
String[] phoneNumber={"123","456","789"};
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
factory.setIgnoringElementContentWhitespace(true); //忽略空白缩进
DocumentBuilder domParser=factory.newDocumentBuilder();
Document document=domParser.newDocument(); //通过调用newDocument() 方法获取实例
document.setXmlVersion("1.0"); //设置 xml版本号
Element root=document.createElement("手机用户表");
document.appendChild(root); //添加根节点
for(int k=1;k<=personName.length;k++){
Node node=document.createElement("用户"); //添加多个用户节点
root.appendChild(node);
}
NodeList nodeList=document.getElementsByTagName("用户");
int size=nodeList.getLength();
for(int k=0;k<size;k++){
Node node=nodeList.item(k);
if(node.getNodeType()==Node.ELEMENT_NODE){
Element elementNode=(Element)node; //有必要创建此对象吗???
Node nodeName=document.createElement("姓名");
Node nodeNumber=document.createElement("号码");
nodeName.appendChild(document.createTextNode(personName[k]));
nodeNumber.appendChild(document.createTextNode(phoneNumber[k]));
elementNode.appendChild(nodeName);
elementNode.appendChild(nodeNumber);
}
}
TransformerFactory transFactory=TransformerFactory.newInstance(); //工厂对象获取transFactory实例
Transformer transformer=transFactory.newTransformer(); //获取Transformer实例
DOMSource domSource=new DOMSource(document);
File file=new File("phone.xml");
FileOutputStream out=new FileOutputStream(file);
StreamResult xmlResult=new StreamResult(out);
transformer.transform(domSource, xmlResult);
out.close(); } catch (Exception e) {
e.printStackTrace();
} }
}
JAVA与DOM解析器基础 学习笔记的更多相关文章
- JAVA与DOM解析器提高(DOM/SAX/JDOM/DOM4j/XPath) 学习笔记二
要求 必备知识 JAVA基础知识.XML基础知识. 开发环境 MyEclipse10 资料下载 源码下载 sax.dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无 ...
- 尚学堂JAVA基础学习笔记
目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...
- Java基础学习笔记总结
Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...
- Java基础学习笔记(一)
Java基础学习笔记(一) Hello World 基础代码学习 代码编写基础结构 class :类,一个类即一个java代码,形成一个class文件,写于每个代码的前端(注意无大写字母) XxxYy ...
- Java DOM解析器 - 解析XML文档
使用DOM的步骤 以下是在使用DOM解析器解析文档使用的步骤. 导入XML相关的软件包. 创建DocumentBuilder 从文件或流创建一个文档 提取根元素 检查属性 检查子元素 导入XML相关的 ...
- Java DOM解析器
文档对象模型是万维网联盟(W3C)的官方推荐.它定义了一个接口,使程序能够访问和更新样式,结构和XML文档的内容.支持DOM实现该接口的XML解析器. 何时使用? 在以下几种情况时,应该使用DOM解析 ...
- dom解析器机制 web基本概念 tomcat
0 作业[cn.itcast.xml.sax.Demo2] 1)在SAX解析器中,一定要知道每方法何时执行,及SAX解析器会传入的参数含义 1 理解dom解析器机制 1)dom解析和dom4j原理 ...
- 《JavaScript DOM 编程艺术》 学习笔记
目录 <JavaScript DOM 编程艺术> 学习笔记 第一章 js简史 第二章 js语法 准备工作 语法 第三章 DOM DOM中的D DOM中的O DOM中的M 第四章 js图片库 ...
- 20145213《Java程序设计》第八周学习笔记
20145213<Java程序设计>第八周学习笔记 教材学习内容总结 "桃花春欲尽,谷雨夜来收"谷雨节气的到来意味着寒潮天气的基本结束,气温回升加快.刚出冬的我对于这种 ...
随机推荐
- 前端- html 和css
html HTML 指超文本标签语言. HTML 是通向 WEB 技术世界的钥匙. html属性:所有标签的通用属性 html事件:On...html5加了很多事件 html视频/音频:处理音视频 h ...
- (转)ASP.NET MVC3 Razor视图引擎-基础语法
转自:http://kb.cnblogs.com/page/96883/ I:ASP.NET MVC3在Visual Studio 2010中的变化 在VS2010中新建一个MVC3项目可以看出与以往 ...
- 20155326刘美岑 2016-2017-2 《Java程序设计》第二周学习总结
20155326刘美岑 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 教材第三章主要讲解的是基础语法,主要包括认识类型与变量.学习运算符的基本使用.了解类型 ...
- presto调研和json解析函数的使用
presto简单介绍 presto是一个分布式的sql交互式查询引擎.可以达到hive查询效率的5到10倍.支持多种数据源的秒级查询. presto是基于内存查询的,这也是它为什么查询快的原因.除了基 ...
- Objective-C与Swift混编
1,创建项目(比如你先选择Objective-C) 2,项目创建成功后接着创建一个swift类 3,Xcode会弹出提示框问你需不需要创建桥接文件(桥接文件的名称默认为:项目名称-Bridging- ...
- day09_雷神_模块二
day09 序列化之json 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊 ...
- 2.虚拟机安装的ubuntu全屏显示
虚拟机下面安装了ubuntu系统,显示的屏幕只有那么一小块儿,不知道如何才能全屏,那么如何全屏呢?且看下面经验. 方法/步骤 打开虚拟机,并点击要更改成全屏的那个ubuntu系统的电源 我的虚拟机名字 ...
- Crontab有关
AIX下面 0,2,4,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,58 * * * * /usr/s ...
- headpq
从一个集合中获得最大或者最小的N个元素列表 http://python3-cookbook.readthedocs.io/zh_CN/latest/c01/p04_find_largest_or_sm ...
- jar包获取资源文件
背景 写的一个spring boot项目打成jar包部署运行下,打成jar包,提示找不到资源文件,如下图: 直接通过idea是可以运行的,但打成jar包后提示找不到资源文件,简单查阅后了解到是因为ja ...