zoukankan      html  css  js  c++  java
  • 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
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
  • 相关阅读:
    Angular Universal 学习笔记
    SAP Spartacus 如何获得当前渲染页面的 CMS 元数据
    Angular 服务器端渲染的学习笔记(二)
    Angular 服务器端渲染的学习笔记(一)
    第三方外部 Saas提供商如何跟使用 SAP 系统的客户进行对接接口集成
    如何从 SAP Spartacus Product Detail 页面,找到其 Angular 实现 Component 的位置
    具备自动刷新功能的 SAP ABAP ALV 报表
    C++学习目录
    c--条件编译
    c--文件读写--二进制
  • 原文地址:https://www.cnblogs.com/xiazdong/p/3058366.html
Copyright © 2011-2022 走看看