笔记:XML-解析文档-DOM
要处理XML文档,就要先解析(parse)他,解析器时这样一个程序,读入一个文件,确认整个文件具有正确的格式,然后将其分解成各种元素,使得程序员能够访问这些元素,Java库提供了两种XML解析器:
- 像文档对象模型(Document Object Model,DOM)解析器这样的树型解析器,他们将读入的XML文档转换成树结构
- 像XML简单API(Simple API for XML,SAX)解析器这样的流机制解析器,他们读入XML文档时生成相应的事件
DOM解析器对于实现我们的大多数目的来说都更容易一些,如果需要处理很长的文档,用他来生成树结构会消耗大量的内存,或者只需要对于某些元素感兴趣,而不关心他们的上下文,那么可以考虑使用SAX解析器。DOM解析器的接口已经被W3C标准化了,org.w3c.dom包中包含了这些接口类型的定义,比如:Document、Element等,不同的实现者都编写了实现这些接口的DOM解析器,Java
XML
处理API(Java
API
for
XML
Processing,JAXP)库使得实际上可以以插件形式使用这些解析器中的任意一个。要读入一个XML文档,首先需要一个DocumentBuilder对象,可以从
DocumentBuilderFactory
中得到这个对象,代码如下:
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
现在,可以从文件中读入某个文档:
File f = …;
Document doc = builder.parse(f);
或者,可以用一个URL:
URL u = …;
Document doc = builder.parse(u);
甚至可以使用一个任意的输入流:
InputStream in = …;
Document doc = builder.parse(in);
Document 对象时XML文档的树型结构在内存的表现,他由实现了 Node 接口及其各子接口的类对象构成,子接口层次结构如下:
DOM
解析XML文档的代码示例如下:
- XML文档内容:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<title>
<font enabled="false">
<!-- 字体名称 -->
<name>Helvetica</name>
<size>36</size>
</font>
<data>
<![CDATA[xml document root node <root.../>]]>
</data>
</title>
</root>
- 解析代码:
public static
void
main(String[] args) {DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = factory.newDocumentBuilder();
Path xmlPath = Paths.get("E:\\IDEA Workspace\\exampleiostream\\src\\main\\java\\org\\drsoft\\examples\\xml", "appParse.xml");
InputStream xmlStream = Files.newInputStream(xmlPath, StandardOpenOption.READ);
Document xmlDocument = builder.parse(xmlStream);
StringBuilder sb = new
StringBuilder();sb.append("<?xml version=\"" + xmlDocument.getXmlVersion() + "\"
encodin=\""+ xmlDocument.getXmlEncoding() + "\"
?>");Element root = xmlDocument.getDocumentElement();
sb.append("<" + root.getTagName() + ">");
NodeList nodeList = root.getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
if (nodeList.item(i) instanceof Element) {
sb.append(parseChildNodes((Element) nodeList.item(i)));
}
}
sb.append("</" + root.getTagName() + ">");
System.out.println(sb.toString());
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
private static String parseChildNodes(Element element) {
StringBuilder sb = new
StringBuilder();sb.append("<" + element.getTagName());
NamedNodeMap map = element.getAttributes();
for (int j = 0; j < map.getLength(); j++) {
sb.append(" " + map.item(j).getNodeName() + "=\"" + map.item(j).getNodeValue() + "\"");
}
sb.append(" >");
if (element.hasChildNodes()) {
NodeList list = element.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
if (list.item(i) instanceof Element) {
Element curElement = (Element) list.item(i);
sb.append(parseChildNodes(curElement));
continue;
}
if (list.item(i) instanceof CDATASection) {
CDATASection cdataSection = (CDATASection) list.item(i);
sb.append("<![CDATA[").append(cdataSection.getData()).append("]]>");
continue;
}
if (list.item(i) instanceof Comment) {
Comment comment = (Comment)list.item(i);
sb.append("<!-- "+comment.getData()+" -->");
continue;
}
if (list.item(i) instanceof Text) {
Text curText = (Text) list.item(i);
sb.append(curText.getData().trim());
continue;
}
}
}
sb.append("</" + element.getTagName() + ">");
return sb.toString();
}
笔记:XML-解析文档-DOM的更多相关文章
- XML之DOM解析文档 Day24
TestDom.java package com.sxt.dom; import java.io.File; import java.io.IOException; import javax.xml. ...
- JavaEE实战——XML文档DOM、SAX、STAX解析方式详解
原 JavaEE实战--XML文档DOM.SAX.STAX解析方式详解 2016年06月22日 23:10:35 李春春_ 阅读数:3445 标签: DOMSAXSTAXJAXPXML Pull 更多 ...
- 5月3日上课笔记-XML解析
一.XML编程 1.xml编程的两种解析方式 1.1 dom解析 优点:一次加载,多次使用.可以方便的对xml文档进行增删改查 缺点:如果xml文档过大的话,加载的时候会比较占用内存空间比较大,消耗资 ...
- XML的文档声明
1.XML的文档声明 <?xml version="1.0" encoding="utf-8"?> 文档声明必须写在第一行第一列 属性: versi ...
- 文档ID:某某 模板文件不存在,无法解析文档!
如果是生成栏目列表时出现这样的问题]: 1.可以修改include/arc.listview.class.php这个文件. 2.复制代码 echo "模板文件不存在,无法解析文档 ...
- DedeCMS模板文件不存在,无法解析文档! 问题定位方法
生成静态的时候,经常会遇到“模板文件不存在,无法解析文 档!”的问题.很多朋友试过论坛里很多方法,都是针对某些人可以解决,某些人的问题依旧,为什么呢?其实问题很可能确实是多种多样的,表现结果却是一样, ...
- dedecms 模板文件不存在,无法解析文档"的终极各种解决办法
方法一:[此对应喜欢把模板文件使用".html"的格式,] /include/arc.archives.class.php 556行 if (!preg_match(&qu ...
- dedecms 模板文件不存在 无法解析文档!问题定位方法!
生成静态的时候,经常会遇到“模板文件不存在,无法解析文 档!”的问题.很多朋友试过论坛里很多方法,都是针对某些人可以解决,某些人的问题依旧,为什么呢?其实问题很可能确实是多种多样的,表现结果却是一样, ...
- dedecms 模板文件不存在,无法解析文档的终极各种解决办法
dedecms 模板文件不存在,无法解析文档"的终极各种解决办法 方法一:[此对应喜欢把模板文件使用".html"的格式,] /include/arc.archives. ...
- java解析xml文档(dom)
DOM解析XML文档 读取本地的xml文件,通过DOM进行解析,DOM解析的特点就是把整个xml文件装载入内存中,形成一颗DOM树形结构,树结构是方便遍历和和操纵. DOM解析的特性就是读取xml文件 ...
随机推荐
- android判断网络是否可用
private boolean isNetworkConnected(Context context) { ConnectivityMannger cManager = (ConnectivityMa ...
- 01-python中字符串的常见操作
(1)find 检测str是否包含在myStr中,如果存在则返回开始的索引值,否则返回-1. In [1]: myStr = "hello world tairan and tairanCi ...
- 基于jQuery的一个提示功能的实现
最近有点忙,没有时间更新自己的博客,只能说我在原地踏步了,不知道你们进步了没有? 今天给大家分享一个提示的实现,有点简单,适合小白同学学习.下面是效果图 提示的功能: 当鼠标进入“我的菜单”的子菜单时 ...
- Java语法 示例
第二章: int:整型 double:双精度浮点型 char:字符型 String:字符串型语法:数据类型 变量名: 如:String name: 变量名=值: 如:name="张三&quo ...
- .Net利用Newtonsoft进行解析Json的快捷方法
现在异构系统之间的数据交换多采用Json格式 .Net如何快捷地解析Json和将Object转换成json呢? 1.利用Newtonsoft解析Json字符串 在百度上查找资料,利用Newtonsof ...
- python 字符串格式化输出 %d,%s及 format函数
旧式格式化方式:%s,%d 1.顺序填入格式化内容 s = "hello %s, hello %d"%("world", 100) print(s) 结果: ' ...
- 由js深拷贝引起的对内存空间的一些思考
数据类型 js常用数据类型分为基本类型和引用类型 基本类型:null.undefined.数值型.字符串型.布尔型 引用类型:数组.对象 内存空间 var a = [1, 2, 3]; var b = ...
- Windows环境下使用python 3.x自带的CGI服务器测试cgi脚本--Python
1.在桌面上新建一个文件夹作为服务器目录文件夹(文件夹名称自定义,文件夹位置自定义),在www文件下再建一个文件夹,文件夹名为“cgi-bin”,须是这个文件名,其他试过不行(原因暂时未知)
- python访问mysql和redis
1. 修改mysql配置文件 修改bind-address=0.0.0.0(允许通过远程网络连接) 2. 修改redis配置文件 修改bind-address=0.0.0.0(允许通过远程网络连接), ...
- jquery 实现一个简单的成功提示框,失败提示框
主要的jquery代码:var TS={ successAlert:function(str){ //调用成功的方法 var html='<div class="alert alert ...