<?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. HttpClient的get和post方式提交数据的使用

    /** * Http工具类 */ public class HttpUtil { // 创建HttpClient对象 public static HttpClient httpClient = new ...

  2. HDU 5812 Distance

    从a变到b,也就是将a一直除素因子,除到1为止,然后乘b的素因子,一直乘到b. 但是gcd(a,b)部分是不用除下去的.所以d(a,b)=a/gcd(a,b)的素因子个数+b/gcd(a,b)的素因子 ...

  3. HDU 5352 MZL's City

    最小费用最大流,因为要控制字典序,网络流控制不好了...一直WA,所以用了费用流,时间早的费用大,时间晚的费用少. 构图: 建立一个超级源点和超级汇点.超级源点连向1操作,容量为K,费用为COST,然 ...

  4. 二分图匹配之KM求二分图最佳匹配算法

    参考网址:http://blog.163.com/suntroop@yeah/blog/static/17012103120115185927194/ 对于具有二部划分( V1, V2 )的加权完全二 ...

  5. 一个Cmake的例子

    命令查询列表:http://www.cmake.org/cmake/help/v3.2/manual/cmake-commands.7.html # # Official dependency num ...

  6. SharePoint2013 Set Value To PeoplePicker

    var columnName = 'Display Name';var userName = 'domain\\name';var searchText = RegExp("FieldNam ...

  7. Android数据库--Sqlcipher的使用(二)

    1.使用Sqlcipher对数据库加密,并结合ORM框架LitePal进行使用. 2.对LitePal的使用我就不在讲解了,大家可以参考下面七篇博客: http://blog.csdn.net/guo ...

  8. Entity Framework Code First ---EF Power Tool 和MySql一起使用遇到的问题

    关于如何使用EF Power Tool的介绍请看 http://www.cnblogs.com/LingzhiSun/archive/2011/05/24/EFPowerTool_1.html, 这里 ...

  9. ecshop foreach循环判断循环次数

    首先要在foreach里面加上一个name属相,如:name=name如:<!-- {foreach from=$package_goods.goods_list item=goods_list ...

  10. SQL 优化案例 1

    create or replace procedure SP_GET_NEWEST_CAPTCHA( v_ACCOUNT_ID in VARCHAR2, --接收短信的手机号 v_Tail_num i ...