• XML与java的应用


    对于XML进行解析,我们需要调用第三方提供的接口,对XML文档进行解析;

    对于XML处理方面,W3C有两种解决方法:

    (1)DOM(Document Object Model):

    (2)SAX(Simple API for XML)


    DOM介绍:


    特点:先将xml文档解析成dom树,并放入内存,能够随机访问任意节点。

    缺点:因为需要放入内存操作,所以对文件大小有限制。

    DOM位于org.w3c.dom包中。


    一、3个核心的接口:

    接口所在包:

    import  javax.xml.transform.*;
    import javax.xml.transform.dom.*;
    import javax.xml.transform.stream.*;
    import javax.xml.parsers.*;
    import org.w3c.dom.*;

    (1)Document:是整个文档的根结点。只有取得了Document结点,才能够对文档操作。


    常用方法:

    (1)Element elem = document.createElement("elem");     //创建一个结点

    (2)Attribute attr = document.createAttribute("attr");       // 创建一个属性

    (3)Text t = document.createTextNode("text");          //创建一个文本节点

    (4)NodeList list = document.getElementsByTagName("...");   //寻找某个结点


    (2)Node:DOM树是由结点组成,因此结点是很重要的。


    常用方法:

    (1)appendChild(Node child);      //添加子节点

    (2)getFirstChild();                 //获得第一个子节点

    (3)getNodeValue();           //得到节点的值

    (4)hasChildNodes();         //是否还有子节点


    (3)NodeList:是由Node组成的一个List。


    常用方法:

    (1)Node item(int x);              //获得第几个节点

    (2)getLength();          // 获得list的长度

    如果要获得Document对象,需要:

    ------------------------------------------------------------

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

    DocumentBuilder builder = factory.newDocumentBuilder();

    Document doc = builder.parse("....");获得doc

     ------------------------------------------------------------

    生成xml文件方法:需要TransformerFactory,Transformer,StreamResult,DOMSource。

    方法:

    Document doc = builder.newDocument();

    生成DOM树

    StreamResult result = new StreamResult(new File("..."));

    DOMSource source = new DOMSource(doc);

    TransformerFactory factory  = TransformerFactory.newInstance();

    Transformer t = factory.newTransformer();

    t.transform(source,result);即可




    <?xml version="1.0" encoding="GBK"?>
    <persons>
    	<person>
    		<name>xiazdong</name>
    		<age>20</age>
    		<school>ecnu</school>
    	</person>
    	<person>
    		<name>xzdong</name>
    		<age>15</age>
    		<school>nanyang</school>
    	</person>
    </persons>

    读取文档信息:

    import org.w3c.dom.*;
    import javax.xml.parsers.*;
    public class DOMDemo01{
    	public static void main(String args[])throws Exception{
    		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    		DocumentBuilder builder = factory.newDocumentBuilder();
    		Document doc = builder.parse("demo.xml");
    		NodeList plist = doc.getElementsByTagName("person");
    		for(int i=0;i<plist.getLength();i++){
    			Element elem = (Element)plist.item(i);
    			System.out.println("姓名:"+elem.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());
    			System.out.println("年龄:"+elem.getElementsByTagName("age").item(0).getFirstChild().getNodeValue());
    			System.out.println("学校:"+elem.getElementsByTagName("school").item(0).getFirstChild().getNodeValue());
    		}
    	}
    }

    生成XML文档:

    import org.w3c.dom.*;
    import javax.xml.parsers.*;
    import javax.xml.transform.*;
    import javax.xml.transform.dom.*;
    import javax.xml.transform.stream.*;
    import java.io.*;
    public class DOMDemo02{
    	public static void main(String args[])throws Exception{
    		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    		DocumentBuilder builder = factory.newDocumentBuilder();
    		Document doc = builder.newDocument();
    		Element person = doc.createElement("person");
    		Element age = doc.createElement("age");
    		Element name = doc.createElement("name");
    		Text xiazdong = doc.createTextNode("xiazdong");
    		Text ageText = doc.createTextNode("15");
    		age.appendChild(ageText);
    		name.appendChild(xiazdong);
    		person.appendChild(name);
    		person.appendChild(age);
    		doc.appendChild(person);
    		DOMSource source = new DOMSource(doc);
    		TransformerFactory tf = TransformerFactory.newInstance();
    		Transformer t = tf.newTransformer();
    		StreamResult result = new StreamResult(new File("output.xml"));
    		t.transform(source,result);
    	}
    }

    生成后xml文档结构:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <person>
    	<name>xiazdong</name>
    	<age>15</age>
    </person>


    SAX介绍:


    只能读取,不能生成或改变,并且只能遍历。

    缺点:只能读取。

    SAX的主要方法有5个:


    (1)public void startDocument()throws SAXException;

    (2)public void endDocument()throws SAXException;

    (3)public void startElement(String uri,String localname,String name,Attribute attr)throws SAXException;

    (4)public void endElement(String uri,String localname,String name)throws SAXException;

    (5)public void characters(char[]ch , int start,int length)throws SAXException;


    SAX属于触发类型的,当遇到文档开头就触发(1)方法,遇到元素的开头触发(3)方法;

    因此如果我们需要使用SAX,必须要自己实现一个SAX解析器;

     注意:解析器必须继承DefaultHandler;

    实现完解析器后,则可以做操作:


    SAXParserFactory factory = SAXParserFactory.newInstance();

    SAXParser parser = factory.newSAXParser();

    parser.parse("文件路径",new MySAXParser());


    即可;


    XML解析工具:

    (1)DOM4J

    DOM4J是一个XML操作的包,为了提供给用户更简便的操作XML。

    以下是生成一个XML文件的代码:

    Document doc = DocumentHelper.createDocument();

    Element name = doc.addElement("name");

    Element first = name.addElement("firstname");

    Element second = name.addElement("secondname");

    first.setText("xia");

    second.setText("second");

    OutputFormat format = OutputFormat.createPrettyPrint();

    format.setEncoding("gb2312");

    XMLWriter writer = new XMLWriter(new FileOutputStream("out.xml"),format);

    writer.write(doc);

    writer.close();

    以下是读取一个XML文件的代码:

    SAXReader reader = new SAXReader();

    Document doc = reader.read(new File("out.xml"));

    Element root = doc.getRootElement();

    Iterator iter  = root.elementIterator();

    Element elem = (Element)iter.next();

    String str = elem.elementText("first");

    (2)JDOM:也是一个非常好的解析工具,但是性能上比DOM4J差了不少,所以不用。

    Javascript中运用DOM:把html想象成一个DOM树。

    这里通过id进行查找。

    var elem = document.getElementById("id");

    elem.innerHTML

    生成一个<input type = "button" value = "button"/>过程:

    var form = document.getElementById("form");            //获得表单节点

    Element button = document.createElement("input");        //创建一个节点

    button.setAttribute("type","button");        //设置属性

    button.setAttribute("value","button");    //设置属性

    form.appendChild(button);        //添加form的子节点

    作者:xiazdong
    出处:http://blog.xiazdong.info
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
  • 相关阅读:
    矩形覆盖
    跳台阶与变态跳台阶
    有几个PAT【*】
    找零钱
    有理数的四则运算
    旧键盘打字
    查验身份证
    完美数列【置顶】
    旧键盘
    超简单webservice实例
  • 原文地址:https://www.cnblogs.com/xiazdong/p/3058366.html
Copyright © 2020-2023  润新知