<?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. xfce chrome proxy

    Terminal 下命令行输入:google-chrome-stable %U --proxy-pac-url="http://127.0.0.1:16823/proxy_on.pac&qu ...

  2. 关于LCD的分屏与切屏 Tearing effect

    详细文档(带图片):http://download.csdn.net/detail/xuehui869/5268852 1.LCM之Fmark功能 http://blog.csdn.net/zhand ...

  3. HDU 5813 Elegant Construction

    构造.从a[i]最小的开始放置,例如放置了a[p],那么还未放置的,还需要建边的那个点 需求量-1,然后把边连起来. #pragma comment(linker, "/STACK:1024 ...

  4. js键盘键值大全

    原文地址:http://blog.csdn.net/avenccssddnn/article/details/7950524 js键盘键值 keycode 8 = BackSpace BackSpac ...

  5. hdu 2503 a/b + c/d

    Problem Description 给你2个分数,求他们的和,并要求和为最简形式.   Input 输入首先包含一个正整数T(T<=1000),表示有T组测试数据,然后是T行数据,每行包含四 ...

  6. 【伪一周小结(没错我一周就做了这么点微小的工作)】HDOJ-1241 Oil Deposits 初次AC粗糙版对比代码框架重构版

    2016 11月最后一周 这一周复习了一下目前大概了解的唯一算法--深度优先搜索算法(DFS).关于各种细节的处理还是极为不熟练,根据题意判断是否还原标记也无法轻松得出结论.不得不说,距离一个准ACM ...

  7. oc汉子转拼音

    oc中可以不使用第三方库直接吧数组转成拼音: 代码如下: NSString *str = @"中国abc人民共和国"; CFStringRef aCFString=(__bridg ...

  8. 数据库NULL和 ‘’ 区别

    NULL判断时 : IS NOT NULL ''判断时: !=''

  9. 个人linux简单笔记,随时更新

    vim显示行数 :set nu 查找文件 find /home -name config.txt 重命名文件或者文件夹 mv a b centos中phpize的安装 yum install php- ...

  10. SmtpDlg 调用SMTP

    // SmtpDlg.h : 头文件 // #pragma once #include "afxwin.h" #include "string" using n ...