Android和java创建xml文件和解析xml文件剖析

本文详细介绍了XML的基本概念、在Java和Android中创建与解析XML的常见方法,包括DOM和SAX解析器的工作原理和使用示例。通过对DOM和SAX解析的对比,展示了它们在处理大型XML文档时的效率差异,以及如何利用JAXP API进行解析器切换。此外,还提供了DOM解析的代码示例,展示了如何读取XML文件并提取数据。
摘要由CSDN通过智能技术生成

创建和解析xml文件大致有三种方法:

sax方法

dom方法

pull方法

 

 

一般在java开发环境中用dom方法

1.接口

package cn.com.shine;

public interface xmlInfo {
	 /**  
     * 建立XML文档  
     * @param fileName 文件全路径名称  
     */ 
     public void createXml(String fileName);  
     /**  
     * 解析XML文档  
     * @param fileName 文件全路径名称  
     */ 
     public void parserXml(String fileName);  

}


2.

package cn.com.shine;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.List;

import javax.xml.bind.Element;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
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.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;



public class Xml implements xmlInfo{

	private Document document; 
	  
    public void init() { 
        try { 
            DocumentBuilderFactory factory = DocumentBuilderFactory 
                    .newInstance(); 
            DocumentBuilder builder = factory.newDocumentBuilder(); 
            this.document = builder.newDocument(); 
        } catch (ParserConfigurationException e) { 
            System.out.println(e.getMessage()); 
        } 
    } 

	@Override
	public void createXml(String fileName) {
		org.w3c.dom.Element root = this.document.createElement("scores");  
        this.document.appendChild(root);  
        org.w3c.dom.Element employee = this.document.createElement("employee");  
        org.w3c.dom.Element name = this.document.createElement("name");  
        name.appendChild(this.document.createTextNode("wangchenyang"));  
        employee.appendChild(name);  
        org.w3c.dom.Element sex = this.document.createElement("sex");  
        sex.appendChild(this.document.createTextNode("m"));  
        employee.appendChild(sex);  
        org.w3c.dom.Element age = this.document.createElement("age");  
        age.appendChild(this.document.createTextNode("26"));  
        employee.appendChild(age);  
        root.appendChild(employee);  
        TransformerFactory tf = TransformerFactory.newInstance(); 
        try { 
            Transformer transformer = tf.newTransformer(); 
            DOMSource source = new DOMSource(document); 
            transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312"); 
            transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
            PrintWriter pw = new PrintWriter(new FileOutputStream(fileName)); 
            StreamResult result = new StreamResult(pw); 
            transformer.transform(source, result); 
            System.out.println("生成XML文件成功!"); 
        } catch (TransformerConfigurationException e) { 
            System.out.println(e.getMessage()); 
        } catch (IllegalArgumentException e) { 
            System.out.println(e.getMessage()); 
        } catch (FileNotFoundException e) { 
            System.out.println(e.getMessage()); 
        } catch (TransformerException e) { 
            System.out.println(e.getMessage()); 
        } 
    } 
  
    public void parserXml(String fileName) { 
        try { 
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
            DocumentBuilder db = dbf.newDocumentBuilder(); 
            Document document = db.parse(fileName); 
              
            NodeList employees = document.getChildNodes(); 
            for (int i = 0; i < employees.getLength(); i++) { 
                Node employee = employees.item(i); 
                NodeList employeeInfo = employee.getChildNodes(); 
                for (int j = 0; j < employeeInfo.getLength(); j++) { 
                    Node node = employeeInfo.item(j); 
                    NodeList employeeMeta = node.getChildNodes(); 
                    for (int k = 0; k < employeeMeta.getLength(); k++) { 
                        System.out.println(employeeMeta.item(k).getNodeName() 
                                + ":" + employeeMeta.item(k).getTextContent()); 
                    } 
                } 
            } 
            System.out.println("解析完毕"); 
        } catch (FileNotFoundException e) { 
            System.out.println(e.getMessage()); 
        } catch (ParserConfigurationException e) { 
            System.out.println(e.getMessage()); 
        } catch (SAXException e) { 
            System.out.println(e.getMessage()); 
        } catch (IOException e) { 
            System.out.println(e.getMessage()); 
        } 
    } 

	
}


3

package cn.com.shine;

public class Mainone {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Xml dd=new Xml(); 
        String str="D:/grade.xml"; 
        dd.init(); 
        dd.createXml(str);    //创建xml 
        dd.parserXml(str);    //读取xml 

	}

}


 

================

public class Java2XML {   
    
    public void BuildXMLDoc() throws IOException, JDOMException {   
    
       // 创建根节点 list;   
        Element root = new Element("list");   
          
       // 根节点添加到文档中;   
        Document Doc = new Document(root);   
    
       // 此处 for 循环可替换成 遍历 数据库表的结果集操作;   
       for (int i = 0; i < 5; i++) {   
              
           // 创建节点 user;   
           Element elements = new Element("user");   
              
           // 给 user 节点添加属性 id;   
           elements.setAttribute("id", "" + i);   
              
           // 给 user 节点添加子节点并赋值;   
           // new Element("name")中的 "name" 替换成表中相应字段,setText("xuehui")中 "xuehui 替换成表中记录值;   
           elements.addContent(new Element("name").setText("xuehui"));  
           elements.addContent(new Element("age").setText("28"));  
           elements.addContent(new Element("sex").setText("Male"));  
   
           // 给父节点list添加user子节点;  
           root.addContent(elements);  
   
       }  
        XMLOutputter XMLOut = new XMLOutputter();  
         
       // 输出 user.xml 文件;  
        XMLOut.output(Doc, new FileOutputStream("user.xml"));  
    }  
   
    public static void main(String[] args) {  
       try {  
           Java2XML j2x = new Java2XML();  
           System.out.println("生成 mxl 文件...");  
           j2x.BuildXMLDoc();  
       } catch (Exception e) {  
           e.printStackTrace();  
       }  
    }  


 

生成的 user.xml  文件  
<?xml version="1.0" encoding="UTF-8"?>  
<list>  
    <user id="0">  
        <name>xuehui</name>  
        <age>28</age>  
        <sex>Male</sex>  
    </user>  
    <user id="1">  
        <name>xuehui</name>  
        <age>28</age>  
        <sex>Male</sex>  
    </user>  
</list>
生成XML时候处理缩进,对输出格式进行美化
  只需要将上面生成XML时候的带吗修改成如下代码: 
Format format = Format.getPrettyFormat();
XMLOutputter XMLOut = new XMLOutputter(format);
XMLOut.output(Doc, new FileOutputStream("user.xml"));
生成XML的时候,处理特殊字符
element.addContent(new CDATA("<xml> content"));
生成XML的时候,设置编码
XMLOutputter XMLOut = new XMLOutputter();
XMLOut.setEncoding("gb2312");
XMLOut.output(Doc, new FileOutputStream("test1.xml"));

 

一般在android开发中用sax方法

 

package com.shine.victor;

import java.io.OutputStream;
import java.util.List;

import org.xmlpull.v1.XmlSerializer;

import android.util.Xml;

public class PullBuildXMLService {
	public void buildXML(List<Person> persons,OutputStream outputStream)throws Exception{
		XmlSerializer serializer = Xml.newSerializer();
		serializer.setOutput(outputStream,"utf-8");
		serializer.startDocument("utf-8", true);
		serializer.startTag(null, "perisons");
		for(Person person:persons){
			serializer.startTag(null, "perison");
			serializer.attribute(null, "id",String.valueOf(person.id));
			
			serializer.startTag(null, "name");
			serializer.text(person.name);
			serializer.endTag(null, "name");
			
			serializer.startTag(null, "age");
			serializer.text(String.valueOf(person.age));
			serializer.endTag(null, "age");

			serializer.endTag(null, "perison");
		}
		serializer.endTag(null, "perisons");
		serializer.endDocument();
		outputStream.close();
	}
}

 

2


 

package com.shine.victor;

import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Button bt=(Button) this.findViewById(R.id.bt);
		bt.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				try {
					writeFile();
				} catch (Throwable e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}
	public void writeFile() throws Throwable{
		   List<Person> list = new ArrayList<Person>();
		  for(int i =0;i<10;i++){
			  Person person = new Person();
			  person.id = 1;
			  person.name = "ant";
			  person.age = 12;
			  list.add(person);
		  }
		   File file = new File(MainActivity.this.getFilesDir(),"person.xml");
		   FileOutputStream outputStream  = new FileOutputStream(file);
		   PullBuildXMLService service = new PullBuildXMLService();
		   service.buildXML(list, outputStream);
	   }

}


 

=====================&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值