DOM4j 操作XML
<?xml version="1.0" encoding="GBK"?>
<persons>
<men>
<person id = "20111907">潘腾</person>
<person id = "20111901">雷帅</person>
</men>
<women>
<person id = "20111908">杨悦</person>
<person id = "20111908">张东月</person>
</women>
</persons>
import java.io.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import org.dom4j.*;
import org.dom4j.io.*;
import java.util.*;
import org.jaxen.*;
public class DOM_XML {
public static void main(String[] args)
{
try
{
// read_xml1();
// read_xml2();
// read_xml3();
// read_xml4();
// creatXml();
modifyXML();
}
catch(Exception e)
{
System.out.println("错误信息:" + e);
}
} /**
* 第一种方式 使用迭代器读XML
*/
public static void read_xml1()
{
try
{
SAXReader reader = new SAXReader(); //解析器
Document doc = reader.read(new File("persons.xml")); //文档对象
Element root = doc.getRootElement(); //获取根元素 <persons>
Iterator it = root.elementIterator(); //<men> <women>
while(it.hasNext())
{
Element ele = (Element)it.next();
Iterator sec_it = ele.elementIterator();
while(sec_it.hasNext())
{
Element man = (Element)sec_it.next(); //不调用next方法,就不会下移 便会产生死循环
String name = man.getName();
String attr = man.attributeValue("id");
String content = man.getText();
System.out.println("name:" + name + "\nid: " + attr + "\nContent: " + content);
}
}
}
catch(Exception e)
{ }
} /**
* 第二种方式 elements
*/
public static void read_xml2()
{
try
{
SAXReader reader = new SAXReader(); //解析器
Document doc = reader.read(new File("persons.xml")); //文档对象
Element root = doc.getRootElement(); //获取根元素 <persons>
List<Element> listEle = root.elements("men"); //获取root下的所有men元素
List<Element> listMen = listEle.get(0).elements("person"); //获取men下的所有person元素
for(Element element_obj:listMen)
{
String name = element_obj.getName();
String attr = element_obj.attributeValue("id");
String content = element_obj.getText();
System.out.println("name:" + name + "\nid: " + attr + "\nContent: " + content);
}
}
catch(Exception e)
{ }
} /**
* 第三种方式 使用适配器 这个暂时没有搞懂
*/
public static void read_xml3()
{
try
{
SAXReader reader = new SAXReader(); //解析器
Document doc = reader.read(new File("persons.xml")); //文档对象
Element root = doc.getRootElement(); //获取根元素 <persons> //第三种方式 适配器
doc.accept(new VisitorSupport() {//使用观察器的子类,来完成对xml文件的读取。 public void visit(Element el) {//利用观察期进行xml的读取。 System.out.println(el.getName()+": "+el.getText());
} });
}
catch(Exception e)
{ } } /**
* 第四种方式 selectNodes
* selectNodes的参数是元素路径 需要学习XPath相关知识
*/
public static void read_xml4()
{
try
{
SAXReader reader = new SAXReader(); //解析器
Document doc = reader.read(new File("persons.xml")); //文档对象
Element root = doc.getRootElement(); //获取根元素 <persons> //第四种 使用selectNodes读取XML
//需要导入 org.jaxen.* 包 否则会报错
List list = doc.selectNodes("//persons/men/person");//使用selectNodes获取所要查询xml的节点。
for(Object obj:list){//遍历节点,获取节点内数据。
Element el = (Element)obj;
System.out.println(el.getText());
}
}
catch(Exception e)
{}
} /**
* 创建XML文件
* XML文件第一行 encoding值为UTF-8 这是错误的
* java 在windows 中文版环境下 默认采用的是GBK,所以需要手动更改
*/
public static void creatXml()
{
try
{
Document newdoc = DocumentHelper.createDocument();
Element persons = newdoc.addElement("persons");
Element men = persons.addElement("men");
Element person1 = men.addElement("person");
person1.addAttribute("id", "20111907");
person1.setText("panteng");
Element person2 = men.addElement("person");
person2.addAttribute("id", "20111901");
person2.setText("leishuai"); File newxml = new File("newFile.xml");
if(newxml.exists())
{
newxml.delete();
}
newxml.createNewFile(); //创建文件
XMLWriter out = new XMLWriter(new FileWriter(newxml));
out.write(newdoc);
out.flush();
out.close();
System.out.println("文件创建完毕");
}
catch(Exception e)
{ }
} /**
* 修改XML 删除节点、修改 添加属性
*/
public static void modifyXML()
{
try
{
SAXReader reader = new SAXReader(); //解析器
Document doc = reader.read(new File("persons.xml")); //文档对象
Element root = doc.getRootElement(); //获取根元素 <persons>
Element men = root.element("men");
//删除雷帅的记录元素
Iterator it = men.elementIterator();
while(it.hasNext())
{
Element ele = (Element)it.next();
if(ele.getText().equals("雷帅"))
{
men.remove(ele);
}
}
//增加伟男记录
Element weiNan = men.addElement("person");
weiNan.setText("伟男"); //修改 潘腾的id 并增加age属性
Iterator it2 = men.elementIterator();
while(it2.hasNext())
{
Element ele = (Element)it2.next();
if(ele.getText().equals("潘腾"))
{
ele.setAttributeValue("id", "080635");
ele.addAttribute("age", "23");
}
} File newxml = new File("newFile.xml");
if(newxml.exists())
{
newxml.delete();
}
newxml.createNewFile(); //创建文件
XMLWriter out = new XMLWriter(new FileWriter(newxml));
out.write(doc);
out.flush();
out.close();
System.out.println("文件更新完毕");
}
catch(Exception e)
{
System.out.println("错误信息:" + e);
} }
}
不难看出,JAVA 对xml的修改,实际上是修改了doc对象,然后删除原来的文件,将这个对象 重新写入一个文件,文件名和原先的相同。
利用XSD对XML进行验证:
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.xml.sax.SAXException;
import org.dom4j.util.XMLErrorHandler; /**
* 基于XSD验证XML
*/
public static void validateXMLByXSD(String XMLpath,String XSDpath)
{
try
{
//建立schema工厂
SchemaFactory schemaFactory=SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
//建立验证文档文件对象,利用此文件对象所封装的文件进行schema验证
File schemaFile=new File(XSDpath);
//利用schema工厂,接收验证文档文件对象生成Schema对象
Schema schema=schemaFactory.newSchema(schemaFile);
//通过Schema产生针对于此Schema的验证器,利用schenaFile进行验证
Validator validator=schema.newValidator();
//得到验证的数据源
Source source=new StreamSource(XMLpath);
XMLErrorHandler errorHandler = new XMLErrorHandler();
//开始验证,成功输出success!!!,失败输出fail
try{
validator.setErrorHandler(errorHandler);
validator.validate(source); }catch(Exception ex){
ex.printStackTrace();
} if(errorHandler.getErrors().hasContent())
{
System.out.println("验证失败" + errorHandler.getErrors());
}
else
{
System.out.println("验证成功");
}
}
catch(Exception e)
{
System.out.println("错误信息:" + e);
}
}
基于XSD对XML进行验证
DOM4j 操作XML的更多相关文章
- xml解析 使用dom4j操作xml
使用dom4j操作xml 1 导入 dom4j,的jar包 2 指定要解析的XML文件 SAXReader sr=new SAXReader(); Document document= sr.r ...
- DOM4J操作XML(包括封装和解析)
DOM4J操作XML(包括封装和解析) 先来看看dom4j中相应XML的DOM树建立的继承关系 针对于XML标准定义.相应于图2-1列出的内容,dom4j提供了下面实现: 以下给出一个详细事例: pa ...
- 使用dom4j操作XML
DOM4J介绍 DOM4J是使用Java语言编写的,用于读写及操作XML的一套组件,DOM4J同时具有DOM修改文件的优点和SAX读取快速的优点. DOM4J的使用 首先下载dom4j的JAR包,我用 ...
- Strus2第一次课:dom4j操作xml
先从底层的xml操作技术记录: 当我们新建一个项目,什么架包都没加入的时候,java提供了 org.w3c.dom给我们操作xml里面的元素 import org.w3c.dom.Document; ...
- XML学习笔记(2)--dom4j操作XML
1. 介绍(四种方式的比较这部分转载自:http://www.blogjava.net/xcp/archive/2010/02/12/312617.html) 1)DOM(JAXP Crimson解析 ...
- dom4j操作xml文档
java Dom4j解析XML文件 标签(空格分隔):java进阶 xml文档: <?xml version="1.0" encoding="UTF-8" ...
- 使用Dom4j操作XML数据
--------------siwuxie095 dom4j 是一个非常优秀的 Java XML 的 API, 用来读写 XML 文件 和操作 ...
- dom4j操作xml
dom4j是一个Java的XML API,类似于jdom,用来读写XML文件.是一个非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点,同时它也是一个开放源工具.可以在这个 ...
- dom4j操作xml对象
// 获取Documen对象 public static Document getDocument(String path) throws Exception{ ...
- dom4j操作xml的demo
package com.cn.shop.util; import java.io.File;import java.io.FileOutputStream;import java.io.OutputS ...
随机推荐
- 点赞增加的jquery写法
$('.dianzan').click(function(){ $(this).find('span').html(parseInt($(this).find('span').html())+1) } ...
- Oracle 10gR2 Dataguard搭建(非duplicate方式)
Oracle 10gR2 Dataguard搭建(非duplicate方式) 我的实验环境: 源生产库(主库): IP地址:192.168.1.30 Oracle 10.2.0.5 单实例 新DG库( ...
- Chapter 2 Open Book——22
I dropped my head, letting my hair fall to conceal my face. 我低下了我的头,让我的头发垂下来隐藏我的脸. I was sure,though ...
- “Cannot load php5apache2_4.dll into server”问题的解决方法
摘要 PHP5.5.0+Apache Httpd 2.4.3,完成配置文件的修改后,启动Apache服务器,报Cannot load php5apache2_4.dll into server错误,记 ...
- js 插入图片切换,innerHTML
<!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content=&q ...
- IoC容器Autofac正篇之依赖注入(七)
依赖注入,这个专业词我们可以分为两个部分来理解: 依赖,也就是UML中描述事物之间关系的依赖关系,依赖关系描述了事物A在某些情况下会使用到事物B,事物B的变化会影响到事物A: 注入,医生通过针头将药物 ...
- Java良葛格 学习笔记《二》
正则表达式 . 符合任一字符\d 符合0到9任一个数字字符\D 符合0-9以外的字符\s 符合'\t'.'\n'.'\x0B'.'\f'.'\r'等空格符\w 符合a到z.A到Z.0到9等字符,也就是 ...
- html 时间单位
<style>h1{font-size:16px;} .test{position:absolute;left:8px;width:200px;height:100px;margin:0 ...
- PHP常用的预定义常量
<?php echo 'PHP常用的预定义常量'.'<br><br>'; echo '当前php的版本为(PHP_VERSION):'.PHP_VERSION.'< ...
- Android Studio 如何将包名按层级展示
在project视图右上角有个“设置”的按钮,点开,然后将上图所圈部分去勾选就可以了.