<?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的更多相关文章

  1. xml解析 使用dom4j操作xml

     使用dom4j操作xml 1 导入 dom4j,的jar包   2 指定要解析的XML文件 SAXReader sr=new SAXReader(); Document document= sr.r ...

  2. DOM4J操作XML(包括封装和解析)

    DOM4J操作XML(包括封装和解析) 先来看看dom4j中相应XML的DOM树建立的继承关系 针对于XML标准定义.相应于图2-1列出的内容,dom4j提供了下面实现: 以下给出一个详细事例: pa ...

  3. 使用dom4j操作XML

    DOM4J介绍 DOM4J是使用Java语言编写的,用于读写及操作XML的一套组件,DOM4J同时具有DOM修改文件的优点和SAX读取快速的优点. DOM4J的使用 首先下载dom4j的JAR包,我用 ...

  4. Strus2第一次课:dom4j操作xml

    先从底层的xml操作技术记录: 当我们新建一个项目,什么架包都没加入的时候,java提供了 org.w3c.dom给我们操作xml里面的元素 import org.w3c.dom.Document; ...

  5. XML学习笔记(2)--dom4j操作XML

    1. 介绍(四种方式的比较这部分转载自:http://www.blogjava.net/xcp/archive/2010/02/12/312617.html) 1)DOM(JAXP Crimson解析 ...

  6. dom4j操作xml文档

    java Dom4j解析XML文件 标签(空格分隔):java进阶 xml文档: <?xml version="1.0" encoding="UTF-8" ...

  7. 使用Dom4j操作XML数据

    --------------siwuxie095                             dom4j 是一个非常优秀的 Java XML 的 API, 用来读写 XML 文件 和操作 ...

  8. dom4j操作xml

    dom4j是一个Java的XML API,类似于jdom,用来读写XML文件.是一个非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点,同时它也是一个开放源工具.可以在这个 ...

  9. dom4j操作xml对象

         // 获取Documen对象      public static Document getDocument(String path) throws Exception{           ...

  10. dom4j操作xml的demo

    package com.cn.shop.util; import java.io.File;import java.io.FileOutputStream;import java.io.OutputS ...

随机推荐

  1. 十四、oracle 数据库管理--管理表空间和数据文件

    一.概念表空间是数据库的逻辑组成部分.从物理上讲,数据库数据存放在数据文件中:从逻辑上讲,数据库数据则是存放在表空间中,表空间由一个或多个数据文件组成. 二.数据库的逻辑结构oracle中逻辑结构包括 ...

  2. vbs和qtp一些脚本

    ********************************************************************************************** 用vbs调 ...

  3. [VC++]用CTime类得到当前日期、时间、星期,格式化(详细讲解)

    用CTime类得到当前日期.时间.星期,格式化(详细讲解)2009/05/12 09:48 A.M.① 定义一个CTime类对象 CTime time; ② 得到当前时间 time = CTime:: ...

  4. Android面试题集锦 (转)

    转自:http://xiechengfa.iteye.com/blog/1044721 一些常见的Android面试基础题做下总结,看看你能做出多少道? 1. Intent的几种有关Activity启 ...

  5. 在 Visual Studio 2010 中创建 SharePoint 2010 事件接收器

    Microsoft Visual Studio 2010 提供了一个可用于生成事件接收器的项目类型,事件接收器会在 Microsoft SharePoint 2010 网站上选择事件之前或之后执行操作 ...

  6. VideoTexture 贴图

    //old bitmapData.lock(); bitmapData.fillRect(_clippingRect, 0); bitmapData.draw(_player.container, n ...

  7. ueditor浏览器 无法上传文件.问题

    dll也都引用了 路径绝对tmd没问题 最后 我一点一点的调试发现了问题 草tmd百度程序员 */UE.ajax = function() { //创建一个ajaxRequest对象 var fnSt ...

  8. Shell 流程控制-if for case while until break continue

    Shell 流程控制 和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { ...

  9. eclipse关联源码的方法

    1.在项目的libs目录下,新建一个android-support-v4.jar.properties文件 2.打开android-support-v4.jar.properties,编辑. 输入源码 ...

  10. HttpWebResponse远程服务器返回错误: (500) 内部服务器错误

    现象 我们编码实现请求一个页面时,请求的代码类似如下代码: HttpWebRequest req = (HttpWebRequest)WebRequest.Create(strUrl);req.Use ...