加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

XML详解

发布时间:2020-12-16 05:58:23 所属栏目:百科 来源:网络整理
导读:XML详解 1、XML简介 XML在当今的编程世界中无处不在。从Struts、Hiberbate、Spring的各种配置文件到Ajax中的数据交换、再到WebService的推行、SOA理念的应用都离不开XML。 2、XML用途 存储数据、分离数据、交换数据、共享数据。 3、XML语法 一个XML文件分为

XML详解

1、XML简介

XML在当今的编程世界中无处不在。从Struts、Hiberbate、Spring的各种配置文件到Ajax中的数据交换、再到WebService的推行、SOA理念的应用都离不开XML。


2、XML用途

存储数据、分离数据、交换数据、共享数据。


3、XML语法

一个XML文件分为如下几部分内容:

文档声明 、标签、属性、注释、转义字符、CDATA区 、处理指令

在编写XML文档时,需要先使用文档声明,声明XML文档的类型。


最简单的声明语法:

<?xml version="1.0" ?>
用encoding属性说明文档的字符编码:

<?xml version="1.0" encoding="GB2312" ?>
用standalone属性说明文档是否独立:

<?xml version="1.0" encoding="GB2312"  standalone="yes" ?>

标签:

一个标签有如下几种书写形式,例如:

包含标签体:<a>husheng</a>
不含标签体的:<a></a>,简写为:<a/>
一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不允许交叉嵌套。
格式良好的XML文档必须有且仅有一个根标签,其它标签都是这个根元素的子孙标签。


元素:

对于XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理。


属性:

一个标签可以有多个属性,每个属性都有它自己的名称和取值,例如:

<input name=“husheng”>

注释:

Xml文件中的注释采用:“<!--注释-->” 格式。


转义字符:

对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理。



CDATA区:

在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理。
遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直接原封不动的输出。


处理指令:

处理指令,简称PI。处理指令用来指挥解析引擎如何解析XML文档内容。例如,在XML文档中可以使用xml-stylesheet指令,通知XML解析引擎,应用css文件显示xml文档内容。

<?xml-stylesheet type="text/css" href="1.css"?>

4、DOM解析XML文件

DOM4J是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点。


下面我们通过编程来读取XML文件:

1、导包。

2、创建一个xml解析器对象。

3、读取xml文档,返回Document对象。


package cn.eud.hust.husheng;

import java.io.File;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;

public class dom4j {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SAXReader reader = new SAXReader();
		try {
			Document doc = reader.read(new File("list.xml"));
			System.out.println(doc);
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
结果如下:


我们成功读取了这个XML文件。

下面让我们来操作这个文件。

package cn.eud.hust.husheng;


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

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class dom4j {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		List<student> list = new ArrayList<student>();
		// TODO Auto-generated method stub
		SAXReader reader = new SAXReader();
		try {
			Document doc = reader.read(new File("list.xml"));
			System.out.println(doc);
			Iterator<Element> it = doc.getRootElement().elementIterator("people");
			while(it.hasNext()){
				Element elem = it.next();
				//创建Contact
				student stu = new student();
				stu.setId(elem.attributeValue("id"));
				stu.setName(elem.elementText("name"));
				stu.setAge(elem.elementText("age"));
				list.add(stu);
			}
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		for (student stu : list) {
			System.out.println(stu.getName()+"+"+stu.getId()+"+"+stu.getAge());
		}
	}

}

package cn.eud.hust.husheng;

import java.io.File;
import java.io.FileOutputStream;
import java.io.UnsupportedEncodingException;

import org.dom4j.Attribute;
import org.dom4j.Document;
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 test {

	@Test
	public void testFunction() throws Exception{
		
		dom4j re = new dom4j();
		Document doc = new SAXReader().read(new File("list.xml"));
		Element Ele1 = doc.getRootElement().element("people");
		Attribute Att = Ele1.attribute("id");
		Ele1.addAttribute("id","3");      //修改id成3
		WriteOutXML(doc);
		re.main(null);
		Att.setValue("4");                //修改id成4
		WriteOutXML(doc);
		re.main(null);
		Element ageElem = doc.getRootElement().element("people").element("age");
		ageElem.detach();                 //刪除标签
		WriteOutXML(doc);
		re.main(null);
		Ele1.addElement("qq").setText("1258164851");     //修改名字
		WriteOutXML(doc);
		re.main(null);
	}
	
	public void WriteOutXML(Document doc) throws Exception {
		FileOutputStream out = new FileOutputStream("list.xml");
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("utf-8");
		XMLWriter writer = new XMLWriter(out,format);
		writer.write(doc);
		writer.close();
	}
}

修改后的xml文件:

<?xml version="1.0" encoding="utf-8"?>

<list> 
  <people id="4"> 
    <name>husheng</name>  
    <qq>1258164851</qq>
  </people>  
  <people id="2"> 
    <name>wangpeng</name>  
    <age>22</age> 
  </people> 
</list>


5、SAX解析XML文件

SAX 解析器在解析开始的时候就开始发送事件。当解析器发现文档开始、元素开始和文本等时,代码会收到一个事件。
SAX 解析器根本不创建任何对象,它只是将事件传递给您的应用程序。如果希望基于那些事件创建对象,这将由您来完成。

package cn.eud.hust.husheng;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
 *
 */
public class MyDefaultHandler extends DefaultHandler {
	
	/**
	 * 开始文档时调用
	 */
	@Override
	public void startDocument() throws SAXException {
		System.out.println("MyDefaultHandler.startDocument()");
	}
	
	/**
	 * 开始标签时调用
	 * @param qName: 表示开始标签的标签名
	 * @param attributes: 表示开始标签内包含的属性列表
	 */
	@Override
	public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException {
		System.out.println("MyDefaultHandler.startElement()-->"+qName);
	}
	
	/**
	 * 结束标签时调用
	 * @param qName: 结束标签的标签名称
	 */
	@Override
	public void endElement(String uri,String qName)
			throws SAXException {
		System.out.println("MyDefaultHandler.endElement()-->"+qName);
	}
	
	/**
	 * 读到文本内容的时调用
	 * @param ch: 表示当前读完的所有文本内容
	 * @param start: 表示当前文本内容的开始位置
	 * @param length: 表示当前文本内容的长度
	 */ 
	@Override
	public void characters(char[] ch,int start,int length)
			throws SAXException {
		//得到当前文本内容
		String content = new String(ch,start,length);
		System.out.println("MyDefaultHandler.characters()-->"+content);
	}
	
	/**
	 * 结束文档时调用
	 */
	@Override
	public void endDocument() throws SAXException {
		System.out.println("MyDefaultHandler.endDocument()");
	}
	
}
package cn.eud.hust.husheng;

import java.io.File;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class Demo {
	
		public static void main(String[] args) throws Exception{
			//1.创建SAXParser对象
			SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
			//2.调用parse方法
			parser.parse(new File("list.xml"),new MyDefaultHandler());
		}

}

package cn.eud.hust.husheng;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
 * SAX处理器程序
 */
public class MyDefaultHandler2 extends DefaultHandler {
	//存储xml文档信息
	private StringBuffer sb = new StringBuffer();
	
	//获取xml信息
	public String getContent(){
		return sb.toString();
	}
	
	/**
	 * 开始标签
	 */
	@Override
	public void startElement(String uri,Attributes attributes) throws SAXException {
		sb.append("<"+qName);
		//判断是否有属性
		if(attributes!=null){
			for(int i=0;i<attributes.getLength();i++){
				//得到属性名称
				String attrName = attributes.getQName(i);
				//得到属性值
				String attrValue = attributes.getValue(i);
				sb.append(" "+attrName+"=""+attrValue+""");
			}
		}
		sb.append(">");
	}
	
	/**
	 * 文本内容
	 */
	@Override
	public void characters(char[] ch,int length)
			throws SAXException {
		//得到当前读取的文本
		String content = new String(ch,length);
		sb.append(content);
	}
	
	/**
	 * 结束标签
	 */
	@Override
	public void endElement(String uri,String qName)
			throws SAXException {
		sb.append("</"+qName+">");
	}
}
package cn.eud.hust.husheng;

import java.io.File;
import cn.eud.hust.husheng.*;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class Demo {
	
	public static void main(String[] args)throws Exception {
		//1.创建SAXParser
		SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
		//2.读取xml文件
		MyDefaultHandler2 handler = new MyDefaultHandler2();
		parser.parse(new File("list.xml"),handler);
		String content = handler.getContent();
		System.out.println(content);
	}

}


6、xPath技术

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

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class Demo {
	
	public static void main(String[] args) throws Exception{
	
		Document doc = new SAXReader().read(new File("e:/student.xml"));
		
		//1.查询id为2的学生标签
		//使用xpath技术
		Element stuElem = (Element)doc.selectSingleNode("//Student[@id='2']");
		//2.删除标签
		stuElem.detach();
		//3.写出xml文件
		FileOutputStream out = new FileOutputStream("e:/student.xml");
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("utf-8");
		XMLWriter writer = new XMLWriter(out,format);
		writer.write(doc);
		writer.close();
	}
}
import java.io.File;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

public class Demo2 {

	public static void main(String[] args) throws Exception {
		Document doc = new SAXReader().read(new File("./src/contact.xml"));
		
		String xpath = "";
		
		/**
		 * 1.绝对路径 表示从xml的根位置开始或子元素(一个层次结构)
		 */
		xpath = "/contactList";
		xpath = "/contactList/contact";
		
		/**
		 * 2.相对路径 表示不分任何层次结构的选择元素。
		 */
		xpath = "//contact/name";
		xpath = "//name";
		
		/**
		 * 通配符 表示匹配所有元素
		 */
		xpath = "/contactList/*"; //根标签contactList下的所有子标签
		xpath = "/contactList//*";//根标签contactList下的所有标签(不分层次结构)
		
		/**
		 *条件 表示选择什么条件下的元素
		 */
		//带有id属性的contact标签
		xpath = "//contact[@id]";
		//第二个的contact标签
		xpath = "//contact[2]";
		//选择最后一个contact标签
		xpath = "//contact[last()]";
		
		/**
		 *属性 表示选择属性节点
		 */
		xpath = "//@id"; //选择id属性节点对象,返回的是Attribute对象
		xpath = "//contact[not(@id)]";//选择不包含id属性的contact标签节点
		xpath = "//contact[@id='002']";//选择id属性值为002的contact标签
		xpath = "//contact[@id='001' and @name='eric']";//选择id属性值为001,且name属性为eric的contact标签
		
		/**
		 *表示选择文本内容
		 */
		//选择name标签下的文本内容,返回Text对象
		xpath = "//name/text()";
		xpath = "//contact/name[text()='张三']";//选择姓名为张三的name标签
		
		
		List<Node> list = doc.selectNodes(xpath);
		for (Node node : list) {
			System.out.println(node);
		}
	}

}



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

结束。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读