当前位置:  编程技术>java/j2ee

Java生成和解析XML格式文件和字符串的实例代码

    来源: 互联网  发布时间:2014-11-02

    本文导语:  1、基础知识:Java解析XML一般有四种方法:DOM、SAX、JDOM、DOM4J。 2、使用介绍1)、DOM(1)简介 由W3C(org.w3c.dom)提供的接口,它将整个XML文档读入内存,构建一个DOM树来对各个节点(Node)进行操作。优点就是整个文档都一直在内存中,...

1、基础知识:
Java解析XML一般有四种方法:DOM、SAX、JDOM、DOM4J。

2、使用介绍
1)、DOM
(1)简介

由W3C(org.w3c.dom)提供的接口,它将整个XML文档读入内存,构建一个DOM树来对各个节点(Node)进行操作。优点就是整个文档都一直在内存中,我们可以随时访问任何节点,并且对树的遍历也是比较熟悉的操作;缺点则是耗内存,并且必须等到所有的文档都读入内存才能进行处理。

(2)示例代码:

代码如下:



   
       
            599
            CMCC
       
       
            699
            ChinaNet
       
   


代码如下:

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.StringReader;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class XMLHandler {
    public XMLHandler(){

    }

    public String createXML(){
        String xmlStr = null;
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.newDocument();
            document.setXmlVersion("1.0");

            Element root = document.createElement("root");
            document.appendChild(root);

            Element telephone = document.createElement("TelePhone");

            Element nokia = document.createElement("type");
            nokia.setAttribute("name", "nokia");

            Element priceNokia = document.createElement("price");
            priceNokia.setTextContent("599");
            nokia.appendChild(priceNokia);

            Element operatorNokia = document.createElement("operator");
            operatorNokia.setTextContent("CMCC");
            nokia.appendChild(operatorNokia);

            telephone.appendChild(nokia);

            Element xiaomi = document.createElement("type");
            xiaomi.setAttribute("name", "xiaomi");

            Element priceXiaoMi = document.createElement("price");
            priceXiaoMi.setTextContent("699");
            xiaomi.appendChild(priceXiaoMi);

            Element operatorXiaoMi = document.createElement("operator");
            operatorXiaoMi.setTextContent("ChinaNet");
            xiaomi.appendChild(operatorXiaoMi);

            telephone.appendChild(xiaomi);

            root.appendChild(telephone);

            TransformerFactory transFactory = TransformerFactory.newInstance();
            Transformer transFormer = transFactory.newTransformer();
            DOMSource domSource = new DOMSource(document);

            //export string
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            transFormer.transform(domSource, new StreamResult(bos));
            xmlStr = bos.toString();

            //-------
            //save as file
            File file = new File("TelePhone.xml");
            if(!file.exists()){
                file.createNewFile();
            }
            FileOutputStream out = new FileOutputStream(file);
            StreamResult xmlResult = new StreamResult(out);
            transFormer.transform(domSource, xmlResult);
            //--------
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }catch (TransformerConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }catch (TransformerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return xmlStr;
    }

    public void parserXML(String strXML){
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder builder = factory.newDocumentBuilder();
            StringReader sr = new StringReader(strXML);
            InputSource is = new InputSource(sr);
            Document doc = builder.parse(is);
            Element rootElement = doc.getDocumentElement();
            NodeList phones = rootElement.getElementsByTagName("type");
            for (int i = 0; i < phones.getLength(); i++) {
                Node type = phones.item(i);
                String phoneName = ((Element)type).getAttribute("name");
                System.out.println("Phone name = "+phoneName);
                NodeList properties = type.getChildNodes();
                for (int j = 0; j < properties.getLength(); j++) {
                    Node property = properties.item(j);
                    String nodeName = property.getNodeName();
                    if (nodeName.equals("price")) {
                        String price=property.getFirstChild().getNodeValue();
                        System.out.println("price="+price);
                    } else if (nodeName.equals("operator")) {
                        String operator=property.getFirstChild().getNodeValue();
                        System.out.println("operator="+operator);
                    }
                }
            }
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        XMLHandler handler = new XMLHandler();
        String xml = handler.createXML();
        System.out.println(xml);
        handler.parserXML(xml);
    }
}

(3)元素(Element)和结点(Node)的区别(org.w3c.dom)
Node对象是整个文档对象模型的主要数据类型,是DOM中最基本的对象,代表了文档树中的抽象节点。但在实际使用中很少会直接使用Node对象,而是使用Node对象的子对象Element,Attr,Text等。
Element对象表示HTML或XML文档中的一个元素,是Node类最主要的子对象,在元素中可以包含属性,因而Element中有存取其属性的方法。
Element是从Node继承而来的,元素是一个小范围的定义,必须是含有完整信息的结点才是一个元素,例如

...
。但是一个结点不一定是一个元素,而一个元素一定是一个结点。
node有几个子类型:Element,Text,Attribute,RootElement,Comment,Namespace等

2)、SAX


3)、JDOM

4)、DOM4J
(1)简介
dom4j是目前在xml解析方面是最优秀的(Hibernate、Sun的JAXM也都使用dom4j来解析XML),它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。
在使用XPATH时要增加jaxen.jar,否则会出现如下错误:

代码如下:

Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/JaxenException
at org.dom4j.DocumentFactory.createXPath(DocumentFactory.java:230)
at org.dom4j.tree.AbstractNode.createXPath(AbstractNode.java:207)     
at org.dom4j.tree.AbstractNode.selectNodes(AbstractNode.java:164)

(2)示例代码:

代码如下:

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.xml.sax.InputSource;

public class XMLHandler {

    public XMLHandler() {
        // TODO Auto-generated constructor stub
    }

    public String createXML(){
        String strXML = null;
        Document document = DocumentHelper.createDocument();
        Element root = document.addElement("root");

        Element phone = root.addElement("TelePhone");

        Element nokia = phone.addElement("type");
        nokia.addAttribute("name", "nokia");
        Element price_nokia = nokia.addElement("price");
        price_nokia.addText("599");
        Element operator_nokia = nokia.addElement("operator");
        operator_nokia.addText("CMCC");

        Element xiaomi = phone.addElement("type");
        xiaomi.addAttribute("name", "xiaomi");
        Element price_xiaomi = xiaomi.addElement("price");
        price_xiaomi.addText("699");
        Element operator_xiaomi = xiaomi.addElement("operator");
        operator_xiaomi.addText("ChinaNet");

        //--------
        StringWriter strWtr = new StringWriter();
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("UTF-8");
        XMLWriter xmlWriter =new XMLWriter(strWtr, format);
        try {
            xmlWriter.write(document);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        strXML = strWtr.toString();
        //--------

        //-------
        //strXML=document.asXML();
        //------

        //-------------
        File file = new File("TelePhone.xml"); 
        if (file.exists()) { 
            file.delete(); 
        } 
        try {
            file.createNewFile();
            XMLWriter out = new XMLWriter(new FileWriter(file)); 
            out.write(document); 
            out.flush(); 
            out.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //--------------

        return strXML;
    }

    public void parserXML(String strXML){
        SAXReader reader = new SAXReader();
        StringReader sr = new StringReader(strXML);
        InputSource is = new InputSource(sr);
        try {
            Document document = reader.read(is);

            Element root = document.getRootElement();

            //get element
            List phoneList = root.elements("TelePhone");
            List typeList = phoneList.get(0).elements("type");
            for (int i=0;i


    
 
 

您可能感兴趣的文章:

  • java实现判断字符串是否全是数字的四种方法代码举例
  • Java中关于字符串字符数目的问题
  • java字符串比较获取字符串出现次数的示例
  • 在JAVA中如何实现在一个长字符串查找某个字符串??
  • 我使用corba将Java和C程序连接起来,由Java向C传递一个字符串,但是我发现我原来的0a被换成了0d 0a,那位给各解释。
  • 用Java正则去掉字符串中重复出现的字符
  • java实现压缩字符串和java字符串过滤
  • java 字符串有沒有 像 javascript 中 split() 的方法.
  • 如何从java字符串中判断空格在第几位
  • java把字符串写入文件里的简单方法分享
  • java中如何将数字转化为字符串并且不足位数补0
  • 如可在java程序中产生一个几乎永不重复的字符串?
  • 使用java如何分析系统不能识别的字符串?
  • 菜鸟问题:在Java中如何接收从键盘输入的字符串?
  • 请问JAVA中怎样去掉字符串后面的空格,谢谢!!!
  • JAVA求字符串的子串,谢谢!
  • 在java/jsp里怎样判断一个yyyymmdd格式的字符串是合法的日期型字符串,并求两日期字符串之间的天数?
  • 请问在Java里有没有 运算一个字符串的方法? 如vbscript的 eval("3+5*2") = 13
  • java中一个逻辑判断字符串 (1&&0)如何转变成boolean值?
  • java字符串的合并
  • Java判断字符串为空、字符串是否为数字
  • java中如何将ascII 码转换成字符以及将字符转换成ascII码? 在线等待加分!
  • java中对字符串每个字符统计的方法
  • java判断日期字符是否有效(在线等待答案)
  • 如何在java中将任意字符转化为数字
  • 我的问题是:在java中是否有方法能够去掉一行字符串中的某个字符。
  • java中的转义字符介绍
  • Java String字符串和Unicode字符相互转换代码
  • 16进制值为0D的字符在java里怎么写?
  • 菜鸟问题:java如何进行字符处理?
  • 请问java如何判断中文字和字符,有没有这样的类或方法...
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java Servlet获取和设置cookie实例代码
  • 万般火急!关于java打印,已经得到printerJob实例,那么怎么通过它得到Pageable实例?
  • 可以有其他两个类的实例同时调用一个java实例的两个方法吗?
  • <java技术手册>与<java实例技术手册>这两本书怎么样?
  • Java单例模式实例简述
  • 寻求java加密算法及实例
  • java web start实例代码COPY不了,怎么办?
  • 请问哪里有《java实例技术手册》的电子书下载?100分赠送!
  • 请教:JAVA中说什么类的实例,那是怎么样的一个概念呢?
  • java实现大数加法(BigDecimal)的实例代码
  • Java究竟能干些什么呢?清高手们列举一些实例出来,跟帖有分.
  • java HashMap的keyset实例
  • java获取当前日期使用实例
  • java之super关键字用法实例解析
  • Java调用DOS实现定时关机的实例
  • java结束进程的实例代码
  • 急!大家谁有类似visio的java实例或代码?
  • java 如何获取对象实例的大小
  • 高分火速求解,请在线朋友回答:java自定义类怎样生成实例数组?( className[] N=new className[X];怎么不行?)
  • 刚学java想试编一个文本编辑器,各位能不能给推荐一些较好的参考程序或实例
  • Java位运算和逻辑运算的区别实例
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3