Java操作xml大全

一、xml简介

可扩展标记语言 () 于 1998 年 2 月 10 日成为 W3C 的推荐标准

Xml用来设计传输和存储数据,html用来是设计显示数据。

Xml没有预定义标签,需要进行自定义。

平时在进行开发的时候,例如进行hibernate开发的时候,我们可以导入自己预先定地的dtd文件(标记符的语法规则)进行规范化。

.XML  HTML的主要差异

XML 不是 HTML的替代。

XML  HTML为不同的目的而设计:

XML 被设计为传输和存储数据,其焦点是数据的内容。

HTML 被设计用来显示数据,其焦点是数据的外观。

HTML 旨在显示信息,而 XML旨在传输信息。

三、xml语法

1、声明版本,编码,文档是否独立 <?xml version="1.0" encoding=" UTF-8 "?>
2、字符引用(charactor reference):&#十进制,&#x十六进制
3、实体引用(entity reference):lt,gt,amp,quot,apos,分别表示,小于,大于,&,引号,省略号,可以在DTD中定义
4CDATACDATA section)原始字符,<![CDATA[这里面包含内容]]>
5、处理指令,<?  ?>,如:<? Xml-stylesheet href= mystyle.css  type= text/css ?>
6、注释<!--这里注释-->

四、Dom解析:树形解析器

1、要读入xml,首先需要DocumentBuilder对象,你可以从DocumentBuilderFactory中获得该对象

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();

2、读入某个xml文档

Document doc = builder.parse(new File());
Document doc = builder.parse(new URL());
Document doc = builder.parse(new InputStream());

3、返回根节点

Element root = doc.getDocumentElement();
4、完成实例:
package cn.itcast.xml;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

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

import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

//使用dom方式对xml文档进行CRUD
public class Demo3 {
	//读取<书名>C++教程</书名>
	@Test
	public void read1() throws Exception
	{
		 DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
		 DocumentBuilder builder=factory.newDocumentBuilder();
		 Document document=builder.parse("src/book.xml");
		 NodeList list=document.getElementsByTagName("书名");
		 Node node=list.item(1);
		 String content=node.getTextContent();
		 System.out.println(content);//C++教程
	}
	//得到文档中所有标签
	@Test
	public void read2() throws Exception
	{
		 DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
		 DocumentBuilder builder=factory.newDocumentBuilder();
		 Document document=builder.parse("src/book.xml");
		 NodeList list=document.getElementsByTagName("书名");
		 Node root=document.getElementsByTagName("书架").item(0);
		 list(root);		 
	}

	private void list(Node node) {
		Node child;
		if (node instanceof Element)
			System.out.println(node.getNodeName());
		NodeList nodelist=node.getChildNodes();
		for (int i=0;i<nodelist.getLength();i++)
		{	
			child=nodelist.item(i);
			list(child);
		}		
	}
	//得到文档中标签属性<书名 name="xxxx">java web就业</书名>
	@Test
	public void read3() throws Exception
	{
		 DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
		 DocumentBuilder builder=factory.newDocumentBuilder();
		 Document document=builder.parse("src/book.xml");

		 
		 NodeList list=document.getElementsByTagName("书名");
		 Node node=list.item(0);
		 if(node.hasAttributes()){
			 NamedNodeMap nodemap=node.getAttributes();
			 for(int i=0;i<nodemap.getLength();i++)
			 {
				 Node nd=nodemap.item(i);
				 String strname=nd.getNodeName();
				 String strval=nd.getNodeValue();
				 System.out.println(strname+":"+strval);//name:dddd
				 
			 }			 
		 }
		 
		 Element node2=(Element)list.item(0);
		 String str3=node2.getAttribute("name");
		 System.out.println("__"+str3);//__dddd
	}
	//<售价>10</售价>	
	@Test
	public void add() throws Exception{
		 DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
		 DocumentBuilder builder=factory.newDocumentBuilder();
		 Document document=builder.parse("src/book.xml");
		 //创建节点
		 Element price=document.createElement("售价");
		 price.setTextContent("59.0元");
		 //把创建的节点放到第一本书上
		 document.getElementsByTagName("书").item(0).appendChild(price);
		 //把跟新后的内容写回文档
		 Transformer transformer=TransformerFactory.newInstance().newTransformer();
		 DOMSource source=new DOMSource(document);
		 FileOutputStream outstream =new FileOutputStream(new File("src/outbook.xml"));
		 StreamResult reslut=new StreamResult(outstream);
		 transformer.transform(source, reslut);
		 outstream.close();		
	}
	
	//向文档中指定位置上添加节点  <售价>10</售价>	
	@Test
	public void add2() throws Exception{
		 DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
		 DocumentBuilder builder=factory.newDocumentBuilder();
		 Document document=builder.parse("src/book.xml");
		 //创建节点
		 Element price=document.createElement("售价");
		 price.setTextContent("59.0元");
		 //得到参考节点
		 Element refNode=(Element)document.getElementsByTagName("售价").item(0);
		 //得到挂崽的节点
		 Element book=(Element)document.getElementsByTagName("书").item(0);
		 //把创建的节点放到第一本书上
		 document.getElementsByTagName("书").item(0).appendChild(price);
		 // 往book节点指定位置插值
		 book.insertBefore(price, refNode);
		 Transformer transformer=TransformerFactory.newInstance().newTransformer();
		 DOMSource source=new DOMSource(document);
		 FileOutputStream outstream =new FileOutputStream(new File("src/outbook2.xml"));
		 StreamResult reslut=new StreamResult(outstream);
		 transformer.transform(source, reslut);
		 outstream.close();		
	}
	//向文档节点 添加属性 <售价>10</售价>	
	@Test
	public void addAtt() throws Exception{
		 DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
		 DocumentBuilder builder=factory.newDocumentBuilder();
		 Document document=builder.parse("src/book.xml");
		 
		 //得到参考节点
		 Element refNode=(Element)document.getElementsByTagName("售价").item(0);
		 refNode.setAttribute("addAtrr","new cha ru value");
		 
		
		
		 Transformer transformer=TransformerFactory.newInstance().newTransformer();
		 DOMSource source=new DOMSource(document);
		 FileOutputStream outstream =new FileOutputStream(new File("src/outbook3.xml"));
		 StreamResult reslut=new StreamResult(outstream);
		 transformer.transform(source, reslut);
		 outstream.close();		
	}
	//删除 <售价>10</售价>	
	@Test
	public void delete() throws Exception{
		 DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
		 DocumentBuilder builder=factory.newDocumentBuilder();
		 Document document=builder.parse("src/book.xml");
		 
		 //得到要删除的节点
		 Element refNode=(Element)document.getElementsByTagName("售价").item(0);
		 refNode.getParentNode().removeChild(refNode);
		
		
		 Transformer transformer=TransformerFactory.newInstance().newTransformer();
		 DOMSource source=new DOMSource(document);
		 FileOutputStream outstream =new FileOutputStream(new File("src/outbook3.xml"));
		 StreamResult reslut=new StreamResult(outstream);
		 transformer.transform(source, reslut);
		 outstream.close();		
	}
	//更新 售价
	@Test
	public void update() throws Exception{
		 DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
		 DocumentBuilder builder=factory.newDocumentBuilder();
		 Document document=builder.parse("src/book.xml");
		 
		 //得到要更新的节点
		 Element refNode=(Element)document.getElementsByTagName("售价").item(0);
		 refNode.setTextContent("1000");
		 
		 Transformer transformer=TransformerFactory.newInstance().newTransformer();
		 DOMSource source=new DOMSource(document);
		 FileOutputStream outstream =new FileOutputStream(new File("src/outbook3.xml"));
		 StreamResult reslut=new StreamResult(outstream);
		 transformer.transform(source, reslut);
		 outstream.close();	
		 
	}

}
5、实例4xml:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<书架>
	<书>
		<书名 name="dddd">java web就业</书名>
		<作者>张孝祥</作者>
		<售价>40</售价>	
	</书>
	<书>
		<书名>C++教程</书名>
		<作者>自己</作者>
		<售价>50</售价>	
	</书>
</书架>

6、sax解析xml文档

book对象代码:

package cn.itcast.sax;

public class Book {
	private String name;
	private String author;
	private String price;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public String getPrice() {
		return price;
	}
	public void setPrice(String price) {
		this.price = price;
	}
}

解析代码:

package cn.itcast.sax;

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.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

public class Demo3 {

	/**
	 * sax解析xml文档
	 */
	public static void main(String[] args) throws Exception {
		//1.创建解析工厂
		SAXParserFactory factory=SAXParserFactory.newInstance();
		//2.得到解析器
		SAXParser sp=factory.newSAXParser();
		//3.得到读取器
		XMLReader reader=sp.getXMLReader();
		//4.设置内容处理器
		BeanListHandler handle=new BeanListHandler();
		reader.setContentHandler(handle);
		//5.读取xml文档内容
		reader.parse("src/book.xml");
		

		List<Book> list=handle.getList();
		list.iterator();
		
	}
}
//把每一本书封装到一个book对象,并把book对象
class BeanListHandler extends DefaultHandler{
	private List<Book> list=new ArrayList<Book>();
	public List<Book> getList() {
		return list;
	}

	private String currentTag;
	private Book book;
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		currentTag=qName;
		if("书".equals(currentTag)){
			book=new Book();
		}
	}
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		if("书名".equals(currentTag)){
			book.setName(new String(ch,start,length));
		}
		if("作者".equals(currentTag)){
			book.setAuthor(new String(ch,start,length));
		}
		if("售价".equals(currentTag)){
			book.setPrice(new String(ch,start,length));
		}
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		if(qName.equals("书")){
			list.add(book);
			book=null;
		}
		currentTag=null;//这句有必要
	}	
}

xml还是上面的src/book.xml

7、dom4j解析xml

package cn.itcast.dom4j;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.OutputStreamWriter;
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.junit.Test;

public class Demo1 {

	public static void main(String[] args) throws Exception {
		read();
	}
	//读第 2 本书的信息 <书名  name="xxxx">C++教程</书名>
	private static void read() throws DocumentException {
		SAXReader reader=new SAXReader();
		Document document=reader.read(new File("src/book.xml"));
		Element root=document.getRootElement();
		Element book=(Element) root.elements("书").get(1);
		String value=book.element("书名").getText();
		String value2=book.element("书名").attributeValue("name");
		System.out.println(value  +";"+value2);
	}
	
	//在第一本上添加一个新的售价
	@Test
	public void add() throws Exception{
		SAXReader reader=new SAXReader();
		Document document=reader.read(new File("src/book.xml"));
		Element book=document.getRootElement().element("书");
		book.addElement("售价").setText("111");	
		//XMLWriter writer=new XMLWriter(new FileWriter("src/book.xml"));
		//XMLWriter writer=new XMLWriter(new OutputStreamWriter(new FileOutputStream("src/book.xml"), "UTF-8"));
		
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("gb2312");
		XMLWriter writer=new XMLWriter(new OutputStreamWriter(new FileOutputStream("src/book.xml"), "gb2312"),format);
		
		writer.write(document);
		writer.close();
	}
	//在第一本书指定位置上添加一个新的售价,更改List集合
	@Test
	public void add2() throws Exception{
		SAXReader reader=new SAXReader();
		Document document=reader.read(new File("src/book.xml"));
		
		Element book=document.getRootElement().element("书");
		List list=book.elements();//[书名,作者,售价]
		
		Element price=DocumentHelper.createElement("售价");
		price.setText("309元");
		list.add(2,price);	
		
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("gb2312");
		XMLWriter writer=new XMLWriter(new OutputStreamWriter(new FileOutputStream("src/book.xml"), "gb2312"),format);
		
		writer.write(document);
		writer.close();
	}
	//删除上面的节点
	public void delete() throws Exception {
		SAXReader reader=new SAXReader();
		Document document=reader.read(new File("src/book.xml"));
		
		Element price=document.getRootElement().element("书").element("售价");
		price.getParent().remove(price);
	}
	//更新节点
	@Test
	public void update() throws Exception{
		SAXReader reader=new SAXReader();
		Document document=reader.read(new File("src/book.xml"));
	
		Element book=(Element) document.getRootElement().elements("书").get(1);
		book.element("作者").setText("张三");
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("gb2312");
		XMLWriter writer=new XMLWriter(new OutputStreamWriter(new FileOutputStream("src/book.xml"), "gb2312"),format);
		
		writer.write(document);
		writer.close();		
	}

}

8、dom4j用xpath获取xml数据

package cn.itcast.dom4j;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.OutputStreamWriter;
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.junit.Test;
//应用xpath提取xml文档的数据,需要包jaxen-1.1-beta-6.jar
public class Demo4 {

	public static void main(String[] args) throws Exception {
SAXReader reader=new SAXReader();
Document document=reader.read(new File("src/book.xml"));
String value=document.selectSingleNode("//作者").getText();//第一个值
System.out.println(value);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值