xml解析(超全)---(三)

DOM4J
/**
  * doc2XmlFile 将Document对象保存为一个xml文件到本地
  *
  * @return true:保存成功 flase:失败
  * @param filename
  *            保存的文件名
  * @param document
  *            需要保存的document对象
  */
 public static boolean doc2XmlFile(Document document, String filename) {
  boolean flag = true;
  try {
   /* 将document中的内容写入文件中 */
   // 默认为UTF-8格式,指定为"GB2312"
   OutputFormat format = OutputFormat.createPrettyPrint();
   format.setEncoding("GB2312");
   XMLWriter writer = new XMLWriter(
     new FileWriter(new File(filename)), format);
   writer.write(document);
   writer.close();
  } catch (Exception ex) {
   flag = false;
   ex.printStackTrace();
  }
  return flag;
 }

/**
  * string2XmlFile 将xml格式的字符串保存为本地文件,如果字符串格式不符合xml规则,则返回失败
  *
  * @return true:保存成功 flase:失败
  * @param filename
  *            保存的文件名
  * @param str
  *            需要保存的字符串
  */
 public static boolean string2XmlFile(String str, String filename) {
  boolean flag = true;
  try {
   Document doc = DocumentHelper.parseText(str);
   flag = doc2XmlFile(doc, filename);
  } catch (Exception ex) {
   flag = false;
   ex.printStackTrace();
  }
  return flag;
 }
/**
  * load 载入一个xml文档
  *
  * @return 成功返回Document对象,失败返回null
  * @param uri
  *            文件路径
  */
 public static Document load(String filename) {
  Document document = null;
  try {
   SAXReader saxReader = new SAXReader();
   document = saxReader.read(new File(filename));
  } catch (Exception ex) {
   ex.printStackTrace();
  }
  return document;
 }
/**
  * xmlWriteDemoByString 演示String保存为xml文件
  */
 public void xmlWriteDemoByString() {
  String s = "";
  /** xml格式标题 "<?xml version='1.0' encoding='GB2312'?>" 可以不用写 */
  s = "<config>\r\n" + "    <ftp name='DongDian'>\r\n"
    + "      <ftp-host>127.0.0.1</ftp-host>\r\n"
    + "      <ftp-port>21</ftp-port>\r\n"
    + "      <ftp-user>cxl</ftp-user>\r\n"
    + "      <ftp-pwd>longshine</ftp-pwd>\r\n"
    + "      <!-- ftp最多尝试连接次数 -->\r\n"
    + "      <ftp-try>50</ftp-try>\r\n"
    + "      <!-- ftp尝试连接延迟时间 -->\r\n"
    + "      <ftp-delay>10</ftp-delay>\r\n" + "   </ftp>\r\n"
    + "</config>\r\n";
  // 将文件生成到classes文件夹所在的目录里
  string2XmlFile(s, "d://xmlWriteDemoByString.xml");
  // 将文件生成到classes文件夹里
//  string2XmlFile(s, "classes/xmlWriteDemoByString.xml");
 }
/**
  * 演示手动创建一个Document,并保存为XML文件
  */
 public void xmlWriteDemoByDocument() {
  /** 建立document对象 */
  Document document = DocumentHelper.createDocument();
  /** 建立config根节点 */
  Element configElement = document.addElement("config");
  /** 建立ftp节点 */
  configElement.addComment("东电ftp配置");
  Element ftpElement = configElement.addElement("ftp");
  ftpElement.addAttribute("name", "DongDian");
  /** ftp 属性配置 */
  Element hostElement = ftpElement.addElement("ftp-host");
  hostElement.setText("127.0.0.1");
  (ftpElement.addElement("ftp-port")).setText("21");
  (ftpElement.addElement("ftp-user")).setText("cxl");
  (ftpElement.addElement("ftp-pwd")).setText("longshine");
  ftpElement.addComment("ftp最多尝试连接次数");
  (ftpElement.addElement("ftp-try")).setText("50");
  ftpElement.addComment("ftp尝试连接延迟时间");
  (ftpElement.addElement("ftp-delay")).setText("10");
  /** 保存Document */
  doc2XmlFile(document, "d://xmlWriteDemoByDocument.xml");
 }


/**
  * 演示读取文件的具体某个节点的值
  */
 public static void xmlReadDemo() {
  Document doc = load("d://xmlWriteDemoByDocument.xml");
  // Element root = doc.getRootElement();
  /** 先用xpath查找所有ftp节点 并输出它的name属性值 */
  List list = doc.selectNodes("/config/ftp");
  Iterator it = list.iterator();
  while (it.hasNext()) {
   Element ftpElement = (Element) it.next();
   System.out.println("ftp_name="
     + ftpElement.attribute("name").getValue());
  }
  /** 直接用属性path取得name值 */
  list = doc.selectNodes("/config/ftp/@name");
  it = list.iterator();
  while (it.hasNext()) {
   Attribute attribute = (Attribute) it.next();
   System.out.println("@name=" + attribute.getValue());
  }
  /** 直接取得DongDian ftp的 ftp-host 的值 */
  list = doc.selectNodes("/config/ftp/ftp-host");
  it = list.iterator();
  Element hostElement = (Element) it.next();
  System.out.println("DongDian's ftp_host=" + hostElement.getText());
 }
/**
  * doc2String 将xml文档内容转为String
  *
  * @return 字符串
  * @param document
  */
 public static String doc2String(Document document) {
  String s = "";
  try {
   // 使用输出流来进行转化
   ByteArrayOutputStream out = new ByteArrayOutputStream();
   // 使用GB2312编码
   OutputFormat format = new OutputFormat("   ", true, "UTF-8");
   XMLWriter writer = new XMLWriter(out, format);
   writer.write(document);
   s = out.toString("UTF-8");
  } catch (Exception ex) {
   ex.printStackTrace();
  }
  return s;
 }
 实例一:(读取硬盘存在的xml文件)
 SAXReader read=new SAXReader();
   Document doc=null;
   try {
    doc=read.read(new File("d://student.xml"));
    
    List classes=doc.selectNodes("//class");
    System.out.println("某学校共有"+classes.size()+"个班级");
    
    for(Iterator it=classes.iterator();it.hasNext();){
     Element eleClass=(Element)it.next();
     String id=eleClass.attributeValue("name");
     System.out.println("班级 "+id);
     System.out.println("***********************");
     Iterator it1=eleClass.elementIterator();
     while(it1.hasNext()){
      Element eleStu=(Element)it1.next();
      String name=eleStu.elementText("name");
      String age=eleStu.element("age").getTextTrim();
      System.out.println("姓名:"+name);
      System.out.println("年龄:"+age);
     }
    }
    
   } catch (DocumentException e) {
    e.printStackTrace();
   }
 实例二:(读取xml字符串)
 StringBuffer sb=new StringBuffer("<?xml version=\"1.0\" encoding=\"gb2312\"?>");
   sb.append("<result>");
   sb.append("<class name=\"1\">");
   sb.append("<student id=\"1\">");
   sb.append("<name>龙准</name>");
   sb.append("<age>25</age>");
   sb.append("</student>");
   sb.append("<student id=\"2\">");
   sb.append("<name>龙准2</name>");
   sb.append("<age>23</age>");
   sb.append("</student>");
   sb.append("</class>");
   sb.append("</result>");
   
   try {
    //第一种读取xml字符串的写法
    Document doc=DocumentHelper.parseText(sb.toString());
    //第二种读取xml字符串的写法
//    SAXReader read=new SAXReader();
//    Document doc=read.read(new StringReader(sb.toString()));
    //第三种读取xml字符串的写法
//    SAXReader read=new SAXReader();
//    Document doc=read.read(new ByteArrayInputStream(sb.toString().getBytes()));
    
    List list=doc.selectNodes("//class");
    System.out.println("某学校共有"+list.size()+"个班级");
    for(Iterator it=list.iterator();it.hasNext();){
     Element eleClass=(Element)it.next();
     String id=eleClass.attributeValue("name");
     System.out.println("班级 "+id);
     System.out.println("***********************");
     for(Iterator it1=eleClass.elementIterator();it1.hasNext();){
      Element eleStu=(Element)it1.next();
      String name=eleStu.element("name").getText();
      String age=eleStu.elementText("age");
      System.out.println("姓名:"+name);
      System.out.println("年龄:"+age);

     }
    }
    
   } catch (DocumentException e) {
    e.printStackTrace();
   }
 实例三:(手动创建document并读取)
 Document doc=DocumentHelper.createDocument();
   Element eleResult=doc.addElement("result");
   Element eleClas=eleResult.addElement("class");
   eleClas.addAttribute("name", "1");
   Element elestu=eleClas.addElement("student");
   elestu.addAttribute("id", "1");
   Element eleName=elestu.addElement("name");
   eleName.addText("龙准");
   Element eleAge=elestu.addElement("age");
   eleAge.addText("25");
   
   Element elestu2=eleClas.addElement("student").addAttribute("id", "2");
   elestu2.addElement("name").setText("龙准");
   elestu2.addElement("age").setText("23");
   
   List list=doc.selectNodes("//class");
   System.out.println("某学校共有"+list.size()+"个班级");
   for(Iterator it=list.iterator();it.hasNext();){
    Element eleClass=(Element)it.next();
    String id=eleClass.attributeValue("name");
    System.out.println("班级 "+id);
    System.out.println("***********************");
    for(Iterator it1=eleClass.elementIterator();it1.hasNext();){
     Element eleStu=(Element)it1.next();
     String name=eleStu.element("name").getText();
     String age=eleStu.elementText("age");
     System.out.println("姓名:"+name);
     System.out.println("年龄:"+age);

    }
   }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值