java XML

   XML简介

JavaXML解析大概有四种,包括DOMSAXJDOMDOM4J,其中DOMSAX解析是基础的两种:XML 独立于计算机平台,操作系统和编程语言来表示数据,凭借其简单性、可扩展性、交互性和灵活性在计算机行业中得到了世界范围的支持与采纳,其作用主要有一下3点:

1)数据存储:XOM和数据库一样,都可以实现数据的持久化存储。两者相比,数据库提供了耿强有力的数据存储和分析能力,XML仅仅是存储数据,XML与其他数据表现形式最大的不同时它极其简单。

2)数据交换:在实际应用中,由于各个计算机所使用的操作系统,数据库不同,因此数据之间的交换想来是头疼的事情,但可以使用XML交换数据来解决这个问题,例如:可以将数据库A中的数据转换成标准的XML文件,然后数据库B再将该标准的XML文件转换成适合自己数据要求的数据,以便达到交换数据的目的。

3)数据配置:许多应用都将配置数据存储在XML文件中,使用XML配置文件可读性强,灵活性高,不用像其他应用那样要经过重新编译才能修改和维护应用。

下面我们来看看用DOM来解析XMLDOM即可看成是基于树的模型:

配置文件如下:

<?xml version = "1.0" encoding = "UTF-8"?>
<pet>
    <dog id ="1">
        <name>qizai</name>
        <age>5</age>
        <love>100</love>
    </dog>
    <dog id ="2">
        <name>maomao</name>
        <age>3</age>
        <love>101</love>
    </dog>
</pet>

下面用DOM来解析一下:

package my02;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class TestDOM {
    public static void main(String[] args) {
        // 1 得到DOM解析器的工厂实例
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        // 2 从DOM工厂获得DOM解析器
        try {
            DocumentBuilder db = dbf.newDocumentBuilder();
            // 3 解析XML文档,得到一个Document,即DOM树
            Document doc = db.parse("D:/pet.xml");
            // 4 得到所有pet节点列表信息
            NodeList petList = doc.getElementsByTagName("dog");
            // 5 轮循宠物信息
            System.out.println("XML文件中的宠物初始化信息:");
            for (int i = 0; i < petList.getLength(); i++) {
                Node pet = petList.item(i);
                for (Node node = pet.getFirstChild(); node != null; node = node
                        .getNextSibling()) {
                    if (node.getNodeType() == Node.ELEMENT_NODE) {
                        String name = node.getNodeName();
                        String value = node.getFirstChild().getNodeValue();
                        System.out.println(name + ":" + value + "\t");
                    }
                }
            }
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

   输出结果如下:

XML文件中的宠物初始化信息:
name:qizai 
age:5  
love:100   
name:maomao
age:3  
love:101   

   DOM有其优点:整个文档树在内存中,便于操作,支持删除、修改、重新排列等多种功能;同样它也有缺点:将整个文档调入内存,浪费时间和空间。

   SAX采用的是基于时间的模型,它在解析XML文档时可以触发一系列的时间,当发现给定的tag时,它可以激活一个毁掉方法,告诉该方法制定的标签已经找到,可以在自定义的解析类中定义当事件触发时要做的事情。

SAX解析的优点:不用事先调入整个文档,若是再取值,才能取到字符数据内容,解析器代码小,适于Applet下载;缺点:不是持久的,事件过后,如没有保存数据,那么数据就丢了,无状态性,从时间中只能得到文本,但不知道文本属于哪个元素,只需XML文档的少量内容,很少回头访问,机器内存少。

下面看一个例子:XML同样用上面的例子的

首先需建立一个Pet的实体类,下面是解析类

package my02;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SaxParseXML extends DefaultHandler{
    private List<Pet> list = null;
    private Pet pet = null;
    private String preTagName = null;
    /*
     * 获得pet集合的方法
     */
    public List<Pet> getPet(String fileURL) throws SAXException, IOException, ParserConfigurationException{
        //获得sax解析器工厂
        SAXParserFactory factory = SAXParserFactory.newInstance();
        //从工厂创建sax解析器
        SAXParser parser = factory.newSAXParser();
        //将指定的资源标识符(URL)描述的内容解析为XML
        parser.parse(fileURL, this);
        //返回pet集合
        return this.list;
                                                                                      
    }
    /*
     * 开始文档解析所调用的方法
     */
    public void startDocument() throws SAXException{
        System.out.println("开始解析文档!");
        list = new ArrayList<Pet>();
                                                                                      
    }
    public void startElement(String url,String localName,String qName,Attributes attributes)throws SAXException{
        System.out.println(qName);
        if("dog".equals(qName)){
            pet = new Pet();
            String id = attributes.getValue("id");
            pet.setId(Integer.parseInt(id));
        }
        preTagName = qName;
                                                                                      
                                                                                      
    }
                                                                                  
    public void endEliment(String url,String localName,String qName)throws SAXException{
        if("dog".equals(qName)){
            list.add(pet);
            pet = null;
        }
        preTagName = null;
    }
                                                                                  
    public void characters(char[] ch,int start,int length)throws SAXException{
                                                                                      
        if("name".equals(preTagName)){
            String content = new String(ch,start,length);
            pet.setName(content);
        }else if("age".equals(preTagName)){
            String content = new String(ch,start,length);
            pet.setAge(content);
        }else if("love".equals(preTagName)){
            String content = new String(ch,start,length);
            pet.setLove(content);
        }
                                                                                      
    }
    public void endDocument(){
        System.out.println("解析文档结束!");
    }
                                                                                  
}


   测试以上代码得出:

package my02;
import java.io.IOException;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
public class SaxParseXMLTest {
    public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException {
        SaxParseXML sax = new SaxParseXML();
        String fileURL = "D:\\pet.xml";
        List<Pet>list = sax.getPet(fileURL);
        for(Pet pet : list){
            System.out.println(pet);
        }
    }
}
输出:
开始解析文档!
pet
dog
name
age
love
dog
name
age
love
解析文档结束!

   Xml文件中也可写成JSON形式的,如下所示,格式更加清楚,利于读取,如下所示:

{
"name":"张飞",
"age":20,
"address":{"city":"哈尔滨","street":"和兴路"}
}

  下面看一个JSON的使用方法:

   

  {
    "name":"张飞",
    "age":20,
    "address":{"city":"哈尔滨","street":"和兴路"}
  }
  下面看一个JSON的使用方法:
  package day15.json;
  
  import org.json.JSONObject;
  
  public class TestJson {
    public static void main(String[] args) throws Exception {
        String strJson = getJson();
        parseJson(strJson);
    }
    // json格式的字符串的生成  --
    public static String getJson() throws Exception{
        String strName = "张飞";
        int niAge = 20;
       
        JSONObject json = new JSONObject();
        json.put("name", strName);
        json.put("age", niAge);
       
        JSONObject js = new JSONObject();
        js.put("city", "哈尔滨");
        js.put("street", "和兴路");
       
        json.put("address", js);
        // json格式的字符串
        System.out.println(json.toString());
        return json.toString();
    }
   
    public static void parseJson(String strJson) throws Exception{
        JSONObject json = new JSONObject(strJson);
        String strName = json.getString("name");
        int niAge = json.getInt("age");
        JSONObject js = json.getJSONObject("address");
        String strCity = js.getString("city");
        String strStreet = js.getString("street");
        System.out.println("姓名:"+strName+",年龄:"+niAge+",城市:"+strCity+",街道:"+strStreet);
    }
}  

  从上可看出JSONObject的用法有点像HashMap的用法,关于XML现在真是不太了解,详细请见以后的博客文章吧!欢迎来踩~

   

你可能感兴趣的:(编程语言,配置文件,计算机行业,可扩展性,实际应用)