zoukankan      html  css  js  c++  java
  • Java之JDOM生成XML和解析

    一、生成XML文件  

      1、JDOM是对Java原始的类进行了封装。让解析XML文件变得很方便

      2、创建一个XML文件的根节点:

        Element root = new Element("HD");

      3、将根节点作为参数,构造Document对象(默认一个XML就是一个Document对象)

        Document doc = new Document(root);

      4、其他所有的都是节点都是Element对象,创建Element对象,并将该节点添加进父节点下

        Element disk = new Element("disk");
        root.addContent(disk);

      5、通过调用disk .setAttribute(String name, String value)添加属性,disk.setText(String text)

        Element capacity=new Element("capacity");

        capacity.setText("8G");

        disk.addContent(capacity);

      6、将文件进行输出,已经编码设置:UTF-8

        XMLOutputter XMLOut = new XMLOutputter();
        ByteArrayOutputStream out=new ByteArrayOutputStream();//用来将数组序列化,存储到数据库,如果保存到文件,用FileOutputStream。
        try {
          Format f = Format.getPrettyFormat();
          f.setEncoding("UTF-8");//default=UTF-8
          XMLOut.setFormat(f);

          XMLOut.output(doc,out);//输出

          return out.toByteArray();//转化为数组
        } catch (Exception e) {
          e.printStackTrace();
        }

    二、解析XML文件

      1、获取到输入流

        ByteArrayInputStream input = new ByteArrayInputStream(byte[]bytes);

      2、创建SAXBuilder对象

        SAXBuilder builder = new SAXBuilder();

      3、获取Document对象

        Document doc = builder.build(input);

      4、获得根节点

        Element root = doc.getRootElement();

      5、接下来解析xml有两种方式:一种是直接遍历每个节点;另外一种是通过XPath进行操作

      (1)直接遍历每个节点

        List<Element>nodeList=root.getChildren();

        for(Element ele:nodeList){

          root.getAttributeValue(name);//读取该节点的某个属性

          List<String>attrList=root.getAttributes();//获得所有属性

          String str=root.getText();//获取该节点的值

        }

        如果该子节点还有子节点就继续调用getChildren,继续进行遍历

        

    import java.util.*;
    import org.jdom.*;
    import org.jdom.input.SAXBuilder;
    public class Sample1 {
     public static void main(String[] args) throws Exception{ 
      SAXBuilder sb=new SAXBuilder();
      Document doc=sb.build("sample.xml");
      Element root=doc.getRootElement();
      List list=root.getChildren("disk");
      for(int i=0;i<list.size();i++){
       Element element=(Element)list.get(i);
       String name=element.getAttributeValue("name");
       String capacity=element.getChildText("capacity");
       String directories=element.getChildText("directories");
       String files=element.getChildText("files");
       System.out.println("磁盘信息:");
       System.out.println("分区盘符:"+name);
       System.out.println("分区容量:"+capacity);
       System.out.println("目录数:"+directories);
       System.out.println("文件数:"+files);
       System.out.println("-----------------------------------");
      }  
     }
    }

      (2)XPath的方式:

        XPATH遵循文档对象模型(DOM)的路径格式,由于每个XML文档都可以看成是一棵拥有许多结点的树,

        每个结点可以是以下七个类型之一:根(root)、元素(element)、属性(attribute)、正文(text)、命名空间(namespace)、处理指令(processing instruction)

        和注释(comment)。XPATH的基本语法由表达式构成。

    <?xml version="1.0" encoding="UTF-8"?>
    <HD>
     <disk name="C">
      <capacity>8G</capacity>
      <directories>200</directories>
      <files>1580</files>
     </disk>
     <disk name="D"> 
      <capacity>10G</capacity>
      <directories>500</directories>
      <files>3000</files> 
     </disk>
    </HD>

      

        可以使用路径来查找这些结点,用正斜杠(/)来分隔子结点,返回所有与模式相匹配的元素。下面的XPATH 语句返回所有的disk元素:

        /HD/disk

        "*"代表"全部"的意思。/HD/* 代表HD下的全部节点。

        下面的XPATH将返回任意节点下的名称为disk的全部节点:

        //disk

        下面的XPATH将返回名称为disk,name属性为'C'的全部节点:

        /HD/disk[@name='C']

        节点的附加元素,比如属性,函数等都要用方括号扩起来,属性前面要加上@号

        下面的XPATH将返回文件个数为1580的files节点:

        /HD/disk/files[text()='1580']

        大家注意到上面包含一个text(),这就是XPATH的一个函数,它的功能是取出当前节点的文本。

        下面的XPATH将返回文件个数为1580的分区:

        /HD/disk/files[text()='1580']/parent::*

        最后的parent::*表示这个元素的所有的父节点的集合

        

        拿到节点以后,通过(1)方法里面讲过函数获取的节点的值

    import java.util.*;
    import org.jdom.*;
    import org.jdom.input.SAXBuilder;
    import org.jdom.xpath.XPath;
    public class Sample2 {  
     public static void main(String[] args) throws Exception {
      SAXBuilder sb = new SAXBuilder();
      Document doc = sb.build("sample.xml");
      Element root = doc.getRootElement();
      List list = XPath.selectNodes(root, "/HD/disk");
      for (int i = 0; i < list.size(); i++) { 
       Element disk_element = (Element) list.get(i);
       String name = disk_element.getAttributeValue("name");
       String capacity = ( (Text) XPath.selectSingleNode(disk_element, 
        "//disk[@name='" + name + "']/capacity/text()")).getTextNormalize();
       String directories = ( (Text) XPath.selectSingleNode(disk_element,  
        "//disk[@name='" + name + "']/directories/text()")).getTextNormalize();
       String files = ( (Text) XPath.selectSingleNode(disk_element,  
        "//disk[@name='" + name + "']/files/text()")).getTextNormalize();
       System.out.println("磁盘信息:");
       System.out.println("分区盘符:" + name);
       System.out.println("分区容量:" + capacity);
       System.out.println("目录数:" + directories);
       System.out.println("文件数:" + files);
       System.out.println("-----------------------------------");
      }
     }
    }
    
    
  • 相关阅读:
    javascript实现限制上传文件的大小
    js事件
    表格展开伸缩以及ztree异步加载
    二分法
    php操作beanstalkd
    ubuntu安装操作HttpSQS高速队列
    mysql中安全函数
    php操作httpsqs
    jquery操作表单
    ajax长轮询实例
  • 原文地址:https://www.cnblogs.com/googlemeoften/p/5034185.html
Copyright © 2011-2022 走看看