xml的增删改查示例

来源:互联网 发布:为什么mysql 编辑:程序博客网 时间:2024/05/17 12:03

package com.accp.xml.dom4j;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.dom4j.tree.DefaultDocument;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

/**
 * xml的增删改查示例
 *
 * @author 
 *
 */
public class XMLCrud {

 /**
  * 默认的构造方法
  *
  * @throws DocumentException
  * @throws IOException
  * @throws SAXException
  */
 public XMLCrud() {

  // Document doc = loadXML("class.xml");
  //
  // // 载入XML文档
  // // System.out.println(doc.asXML());
  //
  // // 打印XML文档
  // printDoc(doc);
  //
  // // 把XML文档存入硬盘
  // storeDoc(doc, "new.xml");

  // 新建xml文档对象
  // Document doc1 = this.createDoc();
  //  
  //    
  //     
  //  
  //  
  //
  // //存入note.xml
  // storeDoc(doc1, "note.xml");

  // System.out.println(getStudentCount(doc));

  /*
   * // 校验dtd XML文档 doc = valideDoc("class.xml");
   *
   * printDoc(doc); // 校验Schema文档 doc =
   * validateDocBySxd("classSchema.xml"); printDoc(doc);
   *
   * String url = getClass().getResource("/xml/dom4j/wkjava/class.xsd")
   * .toString(); // 校验Schema文档(俩参数) doc =
   * validateDocBySxd("classSchema.xml", url); printDoc(doc); //
   * 创建Schema文档 doc = createDoc(); storeDoc(doc, "root.xml"); doc =
   * validateDocBySxd("classSchema.xml"); // 在文档中修改原属 updateZip(doc,
   * "102202"); printDoc(doc);
   *
   * doc = validateDocBySxd("classSchema.xml"); // 打印文档中所有学生名字
   * printNames(doc);
   *
   *
   */
 }

 public static void main(String[] args) {

  XMLCrud xml = new XMLCrud();
  xml.genXMLFile();

 }

 /**
  * 装载xml文件,解析为dom文档对象
  *
  * @param xmlfile
  * @return
  * @throws FileNotFoundException
  * @throws DocumentException
  */
 public Document loadXML(String xmlfile) throws FileNotFoundException,
   DocumentException {
  // 获得SAX的xml解析器
  SAXReader reader = new SAXReader();

  // 解析xml文件获得文档对象引用
  Document doc = reader.read(new FileInputStream(xmlfile));
  return doc;
 }

 /**
  * 打印doc文档
  *
  * @param doc
  * @throws IOException
  */
 public void printDoc(Document doc) throws IOException {
  // 创建字符输出流(输出目标为控制台System.out)
  Writer out = new OutputStreamWriter(System.out, "utf-8");

  // 创建输出格式对象
  OutputFormat format = OutputFormat.createPrettyPrint();

  // 由字符输出流对象和输出格式对象为参数创建xml输出对象
  XMLWriter writer = new XMLWriter(out, format);

  // 调用输出方法(如果输出目标为文件,则相当于保存xml文档)
  writer.write(doc);

  // 刷新输出流,清空缓存
  out.flush();
 }

 /**
  * 保存xml文档对象为xml文件
  *
  * @param doc
  * @param filename
  *            指定的文件路径
  * @throws IOException
  */
 public void storeDoc(Document doc, String filename) throws IOException {

  // 获取输出流(输出到文件中,文件内码编码为utf-8)
  Writer out = new OutputStreamWriter(new FileOutputStream(filename),
    "utf-8");

  // 获取一个输出格式对象,用来设置生成的xml的格式
  OutputFormat format = OutputFormat.createPrettyPrint();

  // 设置xml文件缩进的字符,(示例为缩进8个空格)
  format.setIndent("        ");

  // 通过输出流和输出格式对象来生成xml的输出对象
  XMLWriter writer = new XMLWriter(out, format);

  // 保存xml文档到对应文件
  writer.write(doc);

  // 关闭输出流
  out.close();
 }

 public Document validateDocBySxd(String xmlfile) throws SAXException,
   DocumentException, IOException {
  SAXReader reader = new SAXReader(true);
  reader.setFeature("http://apache.org/xml/features/validation/schema",
    true);
  Document doc = reader.read(new FileInputStream(xmlfile));
  return doc;
 }

 public Document valideDoc(String xmlfile) throws DocumentException,
   IOException {
  EntityResolver resolver = new EntityResolver() {
   public InputSource resolveEntity(String publicId, String systemId)
     throws SAXException, IOException {
    if (publicId.equals("//class from weiking")) {
     InputStream in = new FileInputStream("class.dtd");
     return new InputSource(in);
    }
    return null;
   }
  };
  SAXReader reader = new SAXReader(true);
  reader.setEntityResolver(resolver);
  Document doc = reader.read(new FileInputStream(xmlfile));
  return doc;
 }

 public Document validateDocBySxd(String xmlfile, String SchemaUrl)
   throws SAXException, FileNotFoundException, DocumentException {
  SAXReader reader = new SAXReader(true);
  reader.setFeature("http://xml.org/sax/features/validation", true);
  reader.setFeature("http://apache.org/xml/features/validation/schema",
    true);
  reader
    .setFeature(
      "http://apache.org/xml/features/validation/schema-full-checking",
      true);
  reader
    .setProperty(
      "http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation",
      SchemaUrl);
  Document doc = reader.read(new FileInputStream(xmlfile));
  return doc;
 }

 /**
  * 创建xml文档对象 存在于内存中,需要调用保存方法才能持久化该对象
  *
  * @return xml文档树对象
  */
 public Document createDoc() {
  // 创建文档对象有两种方式

  // 1-创建一个缺省的文档对象
  DefaultDocument doc = new DefaultDocument();

  // 2-利用DocumentHelper.createDocument()创建一个文档对象
  // Document doc = DocumentHelper.createDocument();

  // 添加一个元素作为根节点
  Element root = doc.addElement("root");

  // 在根节点上添加子节点及属性还有文本节点
  Element author2 = root.addElement("author")
    .addAttribute("name", "Toby").addAttribute("location",
      "Germany").addText("Tobias Rademacher");
  Element author1 = root.addElement("author").addAttribute("name",
    "James").addAttribute("location", "UK").addText(
    "James Strachan");
  return doc;
 }

 /**
  * 更新文档中某个节点的值 修改的是内存的dom树,所以需要重新调用保存doc
  *
  * @param doc
  * @param zip
  */
 public void updateZip(Document doc, String zip) {
  // 对应节点的xpath表达式
  String xpath = "/Class/Teacher/zip";

  // 根据xpath表达式获取对应节点元素
  Element e = (Element) doc.selectSingleNode(xpath);

  // 修改该节点的值
  e.setText(zip);
 }

 /**
  * 输出dom树
  *
  * @param doc
  */
 public void printNames(Document doc) {
  // 定义xpath表达式字符串
  String xpath = "/Class/Students/Student/name";

  //
  List list = doc.selectNodes(xpath);
  for (Iterator i = list.iterator(); i.hasNext();) {
   Element e = (Element) i.next();
   System.out
     .println(e.element("last").getText() + e.valueOf("first"));
  }
 }

 /**
  * 获取对应节点的数量
  * @param doc
  * @return
  */
 public int getStudentCount(Document doc) {
  int count = 0;

  // XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。
  // 这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似
  String xpath = "count(/Class/Students/Student)";

  //
  count = doc.numberValueOf(xpath).intValue();
  String value = doc.valueOf(xpath);

  count = Integer.parseInt(value);
  return count;
 }

 /**
  * 读取指定路径下的XML文档
  */
 public void genXMLFile() {
  try {
   // 指定一个输出路径
   String nwdir = "C://";

   // 使用SAXReader 解析器
   SAXReader reader = new SAXReader();

   // 读取当前路径下的xml模板文件,在jar包下运行也没问题!
   InputStream isrt = this.getClass().getResourceAsStream("note.xml");
   Document doc = reader.read(isrt);

   // 查询xml中的节点(参数为xpath字符串)
   List projects = doc.selectNodes("/root/author");
   Iterator it = projects.iterator();

   // 遍历xml中的author节点
   while (it.hasNext()) {
    Element elm = (Element) it.next();
    Attribute attribute = elm.attribute("name");
    String nodename = attribute.getValue();

    if (nodename.equals("Toby")) {
     updateVal(elm, nwdir);
    }
   }
   
   // 使用format可以换行排版
   OutputFormat format = new OutputFormat(" ", true);

   // 在指定路径生成新的xml文件
   XMLWriter writer = new XMLWriter(new FileWriter(nwdir
     + "Preferences.xml"), format);
   writer.write(doc);
   writer.close();

  } catch (DocumentException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

 /**
  * 更新xml中的值
  *
  * @param elm
  * @param newStr
  */
 public void updateVal(Element elm, String newStr) {
  // context为xml中的节点
  List nodes = elm.elements("context");

  Iterator i = nodes.iterator();
  while (i.hasNext()) {
   Element e = (Element) i.next();

   // 获取context节点下的所有value节点
   List node = e.elements("value");
   Element end = (Element) node.iterator().next();

   // 更新节点的值
   end.setText(newStr);
  }
 }

}

原创粉丝点击