Java之JDOM生成XML和解析
一、生成XML文件
1、JDOM是对Java原始的类进行了封装。让解析XML文件变得很方便
2、创建一个XML文件的根节点:
Element root = new Element("HD");
3、将根节点作为参数,构造Document对象(默认一个XML就是一个Document对象)
Document doc = new Document(root);
4、其他所有的都是节点都是Element对象,创建Element对象,并将该节点添加进父节点下
Element disk = new Element("disk");
root.addContent(disk);
5、通过调用disk .setAttribute(String name, String value)添加属性,disk.setText(String text)
Element capacity=new Element("capacity");
capacity.setText("8G");
disk.addContent(capacity);
6、将文件进行输出,已经编码设置:UTF-8
XMLOutputter XMLOut = new XMLOutputter();
ByteArrayOutputStream out=new ByteArrayOutputStream();//用来将数组序列化,存储到数据库,如果保存到文件,用FileOutputStream。
try {
Format f = Format.getPrettyFormat();
f.setEncoding("UTF-8");//default=UTF-8
XMLOut.setFormat(f);
XMLOut.output(doc,out);//输出
return out.toByteArray();//转化为数组
} catch (Exception e) {
e.printStackTrace();
}
二、解析XML文件
1、获取到输入流
ByteArrayInputStream input = new ByteArrayInputStream(byte[]bytes);
2、创建SAXBuilder对象
SAXBuilder builder = new SAXBuilder();
3、获取Document对象
Document doc = builder.build(input);
4、获得根节点
Element root = doc.getRootElement();
5、接下来解析xml有两种方式:一种是直接遍历每个节点;另外一种是通过XPath进行操作
(1)直接遍历每个节点
List<Element>nodeList=root.getChildren();
for(Element ele:nodeList){
root.getAttributeValue(name);//读取该节点的某个属性
List<String>attrList=root.getAttributes();//获得所有属性
String str=root.getText();//获取该节点的值
}
如果该子节点还有子节点就继续调用getChildren,继续进行遍历
import java.util.*;
import org.jdom.*;
import org.jdom.input.SAXBuilder;
public class Sample1 {
public static void main(String[] args) throws Exception{
SAXBuilder sb=new SAXBuilder();
Document doc=sb.build("sample.xml");
Element root=doc.getRootElement();
List list=root.getChildren("disk");
for(int i=0;i<list.size();i++){
Element element=(Element)list.get(i);
String name=element.getAttributeValue("name");
String capacity=element.getChildText("capacity");
String directories=element.getChildText("directories");
String files=element.getChildText("files");
System.out.println("磁盘信息:");
System.out.println("分区盘符:"+name);
System.out.println("分区容量:"+capacity);
System.out.println("目录数:"+directories);
System.out.println("文件数:"+files);
System.out.println("-----------------------------------");
}
}
}
(2)XPath的方式:
XPATH遵循文档对象模型(DOM)的路径格式,由于每个XML文档都可以看成是一棵拥有许多结点的树,
每个结点可以是以下七个类型之一:根(root)、元素(element)、属性(attribute)、正文(text)、命名空间(namespace)、处理指令(processing instruction)
和注释(comment)。XPATH的基本语法由表达式构成。
<?xml version="1.0" encoding="UTF-8"?>
<HD>
<disk name="C">
<capacity>8G</capacity>
<directories>200</directories>
<files>1580</files>
</disk>
<disk name="D">
<capacity>10G</capacity>
<directories>500</directories>
<files>3000</files>
</disk>
</HD>
可以使用路径来查找这些结点,用正斜杠(/)来分隔子结点,返回所有与模式相匹配的元素。下面的XPATH 语句返回所有的disk元素:
/HD/disk
"*"代表"全部"的意思。/HD/* 代表HD下的全部节点。
下面的XPATH将返回任意节点下的名称为disk的全部节点:
//disk
下面的XPATH将返回名称为disk,name属性为'C'的全部节点:
/HD/disk[@name='C']
节点的附加元素,比如属性,函数等都要用方括号扩起来,属性前面要加上@号
下面的XPATH将返回文件个数为1580的files节点:
/HD/disk/files[text()='1580']
大家注意到上面包含一个text(),这就是XPATH的一个函数,它的功能是取出当前节点的文本。
下面的XPATH将返回文件个数为1580的分区:
/HD/disk/files[text()='1580']/parent::*
最后的parent::*表示这个元素的所有的父节点的集合
拿到节点以后,通过(1)方法里面讲过函数获取的节点的值
import java.util.*;
import org.jdom.*;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;
public class Sample2 {
public static void main(String[] args) throws Exception {
SAXBuilder sb = new SAXBuilder();
Document doc = sb.build("sample.xml");
Element root = doc.getRootElement();
List list = XPath.selectNodes(root, "/HD/disk");
for (int i = 0; i < list.size(); i++) {
Element disk_element = (Element) list.get(i);
String name = disk_element.getAttributeValue("name");
String capacity = ( (Text) XPath.selectSingleNode(disk_element,
"//disk[@name='" + name + "']/capacity/text()")).getTextNormalize();
String directories = ( (Text) XPath.selectSingleNode(disk_element,
"//disk[@name='" + name + "']/directories/text()")).getTextNormalize();
String files = ( (Text) XPath.selectSingleNode(disk_element,
"//disk[@name='" + name + "']/files/text()")).getTextNormalize();
System.out.println("磁盘信息:");
System.out.println("分区盘符:" + name);
System.out.println("分区容量:" + capacity);
System.out.println("目录数:" + directories);
System.out.println("文件数:" + files);
System.out.println("-----------------------------------");
}
}
}
Java之JDOM生成XML和解析的更多相关文章
- java使用jdom生成xml格式文件
本文生成xml使用的工具是jdom.jar,下载地址如下: 链接:https://eyun.baidu.com/s/3slyHgnj 密码:0TXF 生成之后的文档格式类型,就如上面的图片一样,简单吧 ...
- JDOM生成XML文档的一般方法
由于DOM提供的生成XML的方法不够直观,而且要用到各种繁琐的注解,鉴于此可借助第三方库-----JDOM生成XML文档.具体操作方式如下: import java.io.FileOutputStre ...
- Dom生成Xml和解析Xml
xml这样的文件格式在非常多时候都是非常适合我们用来存取数据的,所以利用程序来生成xml文件和解析xml文件就显得比較重要了.在dom中是把每个元素都看做是一个节点Node的,全部页面上的属性.元素等 ...
- Java——DOM方式生成XML (转)
http://blog.csdn.net/u012325167/article/details/50943202 使用DOM方式生成XML文件有如下几步: 首先是创建DOM树(即规定XML文件中的内容 ...
- Java用Xom生成XML文档
这个总结源于Java编程思想第四版18.13节的案例: 完整代码地址: Java编程思想:XML 相关Api地址: Attribute Element Document Serializer 由于案例 ...
- Java利用dom4j生成xml文件、解析XML
package com.fq.fanqi; import java.io.File;import java.io.FileWriter;import java.io.IOException;impor ...
- JAva使用DOM读取XML数据(解析)
原来一切都是有套路的 使用DOM解析XML文档步骤 1.创建解析器工厂对象 DocumentBuildFactory对象 2.由解析器工厂对象创建解析器对象,即DocumentBuilder对象 3. ...
- java中用jdom创建xml文档/将数据写入XML中
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; i ...
- PHP解析和生成xml(DOMDocument版)
上次和大家分享了SimpleXML操作xml的一些知识,但是php中除了simplexml还有DOMDocument,这次就着重来看看DOMDocument的用法,还是把生成xml和解析xml分开写 ...
随机推荐
- 阅读 - Code Complete 2 - 第33章 - 个人性格
个人性格对于软件项目的开发到底有没有作用或者影响呢? 有的人急于完成自己的工作,当自己的代码遇到问题的时候,不去自己思考并调试而是直接求助于他人,有的人则是自己沉住气,耐心的从头到尾的研究找到错误的所 ...
- MFC解决Static控件背景透明时文本覆盖重影
通过映射OnCtlColor消息,而后在该函数中使用pDC->SetBkMode(TRANSPARENT)使Static控件背景透明时会出现:文本覆盖重影的问题,当改变控件的文本就会发生新文本与 ...
- 优步uber司机怎么注册不了?注册优步司机问题要点
第一,可能是你的车型不符全要求,看是不是5年内的车型,同时要求车价8W以上:第二,你的驾驶年限不够,要求驾驶证年限1年以上的,如果不够的怎么办,告诉你个方法,PS啊!优步可查不了车管所的系统,所以这类 ...
- SDOI(队列)
SDOI Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Sub ...
- [置顶] js模板方法的思路及实现
在js中如何实现设计模式中的模板方法? 思路的产生必然要求熟悉js,如何实现?就很简单了,都知道在js中如果定义两个相同名称的方法,前一个方法就会被后一个方法覆盖掉,使用此特点就可以实现模板方法. 例 ...
- Android应用开发基础篇(1)-----Button
Android应用开发基础篇(1)-----Button 一.概述 Button,顾名思义就是按钮的意思,它主要的功能是响应用户按下按钮时的动作. 二.应用 新建一个工程, ...
- iOS 相互引用引起内存泄露问题说明
release动作只会对自身计数减一,而不会对属性发出release消息,只有该对象的引用计数为0,系统才会对该对象的所有属性发出release消息 类A的属性有类B,类B的属性有类A,而且两者都是强 ...
- Matlab常用小技巧及部分快捷键
Matlab常用小技巧一: 1. m文件如果是函数,保存的文件名最好与函数名一致,这点都很清楚.不过容易疏忽的是,m文件名的命名尽量不要是简单的英文单词,最好是由大小写英文/数字/下划线等组成.原因是 ...
- objective-c 中随机数的用法 (3种:arc4random() 、random()、CCRANDOM_0_1() )
1.随机数的使用 1).arc4random() 比较精确不需要生成随即种子 使用方法 : 通过arc4random() 获取0到x-1之间的整数的代码如下: int value = arc ...
- C# Best Practices - Define Proper Classes
Application Architecture Define the components appropriately for the application and create project ...