使用JDOM和DOM4j解析XML
使用JDOM和DOM4j解析XML 一、JDOM简介: 1是一个开源的项目,基于树形结构,利用纯java的技术对XMl文档实现解析,生成,序列化以及多种操作。2.JDOM直接为Java编程服务,利用更为强有力的Java语言的诸多特性(方法重载,集合等概念),把SAX和DOM的功能有效的结合起来。 3.JDOM是用Java语言读,写,操作XML的新API,函数,在直接,简
使用JDOM和DOM4j解析XML
一、JDOM简介:
1是一个开源的项目,基于树形结构,利用纯java的技术对XMl文档实现解析,生成,序列化以及多种操作。
2.JDOM直接为Java编程服务,利用更为强有力的Java语言的诸多特性(方法重载,集合等概念),把SAX和DOM的功能有效的结合起来。
3.JDOM是用Java语言读,写,操作XML的新API,函数,在直接,简单和高效的前提下,这些API函数被最大限度的优化。
这里有有关JDOM的详细介绍:http://baike.so.com/doc/1003561.html
JDOM由以下几个包构成:
Org.jdom包含了所有的XML文档要素的Java类
Org.jdom.adapters包含了与dom适配的Java类
Org.jdom.filter包含了XML文档的过滤器的类
Org.jdom.input包含了读取XML文档的类
Org.jdom.output包含了写入XML文档的类
Org.jdom.transform包含了将jdomxml文档接口转换为其他文档接口。
Org.jdom.xpath包含了对XML文档XPath操作的类。
解析XML的开源框架:JDOM,DOM4j.
1.对于JDOM的format类的getRawFormat方法,通常用于XML数据的网络传输,因为这种格式会去掉所有不必要的空白,因此能够减少网络传输的数据量。
2.保存到硬盘上,建议使用getPrettyFormat()方法,
二、JDOM使用实例:
public class MyTestJdom {
public static void main(String[] args) {
//MyTestJdom.addChildElement(new String []{"college","grade","classes","students"},"studentTest.xml",null);
}
/**
* 使用JDOM生成简单的XML文档
*/
public static void createDocument(){
//注意标签或者属性不能以数字开头,否则生成报错
//创建根节点
Element root = new Element("schools");
root.setAttribute(new Attribute("name", "**大学")).setAttribute(new Attribute("addr", "吉林省长春市"));
Document document = new Document(root); //将根节点放入Document对象中
//创建学院
Element college = new Element("college");
college.setAttribute("name","计算机科学技术").setAttribute("counselor","张三");
//创建年级
Element grade = new Element("grade");
grade.setAttribute("name","12");
//创建班级
Element classes = new Element("classes");
classes.setAttribute("className","4班").setAttribute("monitor","王五");
//分步添加
Element student = new Element("students");
student.setAttribute("xuehao","3242345");
Element name = new Element("name");
name.setText("李四");
Element sex = new Element("sex");
sex.setText("男");
Element age = new Element("age");
age.setText("23");
//添加student里的元素
student.addContent(name);
student.addContent(sex);
student.addContent(age);
//使用方法链,一次性添加
Element student1 = new Element("students");
student1.setAttribute("xuehao","3242356").
addContent(new Element("name").setText("小芳")).
addContent(new Element("sex").setText("女")).
addContent(new Element("age").setText("21"));
//使用方法链,一次性添加
Element student2 = new Element("students");
student2.setAttribute("xuehao","3242312").
addContent(new Element("name").setText("小郑")).
addContent(new Element("sex").setText("女")).
addContent(new Element("age").setText("22"));
//添加classes里的元素
classes.addContent(student);
classes.addContent(student1);
classes.addContent(student2);
//添加年级里的元素
grade.addContent(classes);
college.addContent(grade);
root.addContent(college);
//创建xml文档
createXML( document,"studentTest.xml",null);
}
/**
* 创建xml文档,当文档更改时,使用该文档进行重新创建
* @param document
* @param fileName
* @param filePath
*/
public static void createXML(Document document,String fileName,String filePath){
//设置xml文档格式
Format format = Format.getPrettyFormat();
format.setIndent(" ");
XMLOutputter output = new XMLOutputter(format);
try {
output.output(document, new FileOutputStream(fileName));
System.out.println("---------------------创建完毕--------------");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 读取xml
* @param fileName
* @param filePath
* @return Document对象
*/
public static Document getDocument(String fileName,String filePath){
SAXBuilder builder = new SAXBuilder();
Document document = null;
try {
document = builder.build(new File(fileName));
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return document;
}
/**
* 使用JDOM解析XML文档
*/
public static void getXml(){
Document document = getDocument("studentTest.xml",null); //在当前项目目录下,文件路劲为null
Element root = document.getRootElement(); //获取根元素schools
System.out.println("rootName = "+root.getName()+" : "+root.getAttributeValue("name")+"\n");
Element college = root.getChild("college"); //得到colleg元素
System.out.println(college.getName()+": "+college.getAttributeValue("name")+"\n");
Element grade = college.getChild("grade") ;
System.out.println("子元素个数:"+grade.getContentSize()+"\n");
Element classes = grade.getChild("classes");
System.out.println("班级"+classes.getAttributeValue("className")+" :班长 "+classes.getAttributeValue("monitor")+"\n");
List eleList = classes.getChildren(); //获取classes下的学生元素
for (Object object : eleList) {
Element student = (Element)object;
System.out.println("学号: "+student.getAttributeValue("xuehao")+" 姓名: "+student.getChildText("name")+" 性别: "+student.getChildText("sex")+" 年龄: "+student.getChildText("age"));
}
System.out.println("--------------------分析完毕------------------");
}
/**
* 为DOM树下的第elemArray的elemArray[n-2]添加子元素
* @param parentElement
*/
public static void addChildElement(String elemArray[],String fileName,String filePath){
Document document = getDocument(fileName,null);
//先获取根元素节点
Element root = document.getRootElement();
System.out.println("rootName "+root.getName());
Element element = null;
for(int i =0;i< elemArray.length;i++){
element = root.getChild(elemArray[i]);
root = element;
}
element = new Element(root.getName());
element.setAttribute("xuehao","3242311").
addContent(new Element("name").setText("小肥")).
addContent(new Element("sex").setText("男")).
addContent(new Element("age").setText("22"));
root.getParentElement().addContent(element);
System.out.println("子元素个数: "+root.getContentSize());
createXML( document, fileName,null); //重新创建
}
}
Xml 创建代码
<?xml version="1.0" encoding="UTF-8"?>
<schools name="**大学" addr="吉林省长春市">
<college name="计算机科学技术" counselor="张三">
<grade name="12">
<classes className="4班" monitor="王五">
<students xuehao="3242345">
<name>李四</name>
<sex>男</sex>
<age>23</age>
</students>
<students xuehao="3242356">
<name>小芳</name>
<sex>女</sex>
<age>21</age>
</students>
<students xuehao="3242312">
<name>小郑</name>
<sex>女</sex>
<age>22</age>
</students>
<students xuehao="3242311">
<name>小肥</name>
<sex>男</sex>
<age>22</age>
</students>
</classes>
</grade>
</college>
</schools>
DOM4j使用实例:
public class MyTestDom4j {
public static void main(String[] args) {
Document doc = MyTestDom4j.createDocument();
MyTestDom4j.outputByUTF(doc, "bookx.xml", null);
doc = getDoc("bookx.xml",null);
MyTestDom4j.getinfo(doc);
}
/**
* 创建Document对象
* @return
*/
public static Document createDocument(){
Element root = DocumentHelper.createElement("books");
Document document = DocumentHelper.createDocument(root); //设置根节点
Element book = root.addElement("book");
book.addAttribute("type", "英语").addAttribute("author", "李阳");
Element publishTime = book.addElement("publishTime");
publishTime.setText("2013-09-08"); //设置文本内容
Element publish = book.addElement("publisher");
publish.setText("延边出版社");
Element bookName = book.addElement("name");
bookName.setText("简单英语词典");
return document;
}
/**
* 将创建的xml文档输出到控制台
* @param document
*/
public static void outputToConsole(Document document){
XMLWriter writer = new XMLWriter();
try {
writer.write(document); //输出到控制台
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 写到硬盘中
* @param document
*/
public static void outputByUTF(Document document,String fileName,String filePath){
OutputFormat format = new OutputFormat(" ",true);
//写到硬盘,使用文件字节输出流-----使用UTF-8编码
try {
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(fileName),format);
xmlWriter.write(document);
xmlWriter.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
*
* @param document
* @param fileName
* @param filePath
*/
public static void outputByGBK(Document document,String fileName,String filePath){
OutputFormat format1 = new OutputFormat(" ",true);
format1.setEncoding("GBK"); //注意设置编码格式,否则中文出现乱码
//使用字符流---使用的是DBK对中文编码
try {
XMLWriter xmlWriter2 = new XMLWriter(new FileWriter(fileName),format1);
xmlWriter2.write(document);
xmlWriter2.flush(); //刷新缓存
xmlWriter2.close(); //记住,要刷新缓存或者关闭xml输出流,否则文件为空
} catch (IOException e) {
e.printStackTrace();
}
}
/**
*解析返回Document对象
* @param fileName
* @param filePath
* @return
*/
public static Document getDoc(String fileName,String filePath){
//第一种解析方式,第二种DOmReader(JAXP方式转换而来)
SAXReader saxReader = new SAXReader();
Document doc = null;
try {
doc = saxReader.read(new File(fileName));
} catch (DocumentException e) {
e.printStackTrace();
}
return doc;
}
/**
* 使用Java自带的方式解析
* @param fileName
* @param filePath
* @return
*/
public static Document getDoc1(String fileName,String filePath){
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
org.w3c.dom.Document document = null;
try {
DocumentBuilder db = dbf.newDocumentBuilder();
document = db.parse(new File("student2.xml"));
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
DOMReader domReader = new DOMReader();
//将JAXP的Document转换成Dom4j的Document
Document doc2= domReader.read(document);
return doc2;
}
//解析xml
public static void getinfo(Document doc){
Element root = doc.getRootElement();
List eleList = root.elements();
for (Object object : eleList) {
Element ele = (Element)object;
System.out.println(ele.getName());
}
}
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)