<?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. hosts etc css-js

    http://laod.cn http://tool.css-js.com/rgba.html

  2. cocos2d-x 获得系统语言繁体

    IosLocalUtil.h #ifndef __IOS_LOCALUTIL_H__ #define __IOS_LOCALUTIL_H__ class IosLocalUtil{ public: s ...

  3. hdu-5794 A Simple Chess(容斥+lucas+dp)

    题目链接: A Simple Chess Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Ot ...

  4. Linux下编译C代码,出现tan函数报错的情况

    undefined reference to `tan' 但是已经包含了头文件 <math.h>了,可还是报错,说是找不到tan 这个问题的原因不是很清楚, 但是网上给出的方案,就是编译的 ...

  5. HOSTS文件修改后不起作用的原因

    如果是通过记事本修改,其实是没有问题的,如果有问题,网上搜到的是ipconfig /flushdns之类的 如果是批量程序写的,那就要小心了, 一定要ANSI(美标格式的,忘了英文是什么来着) 保存后 ...

  6. DB9_公头_母头_串口引脚定义及RS-232串口线制作方法

    RS-232连接线制作方法 材料及工具 一根双绞线(8芯).一个标准RJ45头.一个DB9孔型插头.一把RJ45专用工具.一个电烙铁及若干焊锡. 引脚定义 按以下管脚定义制作RJ45端头:I表示网络视 ...

  7. 100个精选zencart扩展插件

    100个精选zencart扩展插件 特别推荐 1. 数据库备份 2. 产品横向布局. 3. 邮件订阅Newsletter Subscribe. 4. google 翻译google_translate ...

  8. 眼睛跟踪 java

    https://github.com/hosek/eyeTrackSample Simple sample, for eye tracking with OpenCV

  9. openwrt默认不开启wifi

    Openwrt默认不开启wifi,要开启的话, 修改这个文件: openwrt/trunk/package/kernel/mac80211/files/lib/wifi/mac80211.sh. 滚到 ...

  10. C++ 中Hello World的一种写法

    /*C++ Hello World**/#include <stdio.h>#include <iostream>int main(){    printf("Hel ...