Java基础:xml解析

一:xml是什么?

               可扩展的标记语言

              所有的xml都是有由前导区和数据区两部分组成

                              前导区:规定xml的一些属性:version:表示xml的版本

                                                                                     encoding:页面中使用的文字编码

                                                                                     standalone:次xml是否是独立运行

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

                            数据区:必须有一个根元素,一个根元素下可以存放多个子元素,每一个标签必须闭合,区分大小写

  xml能干什么?

                描述,存储,交换数据

        xml与html的区别?

               xml是用来描述数据,标签必须成对出现

               html是用来显示数据,标签可以不成对出现

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- xml头标签:
version:版本号
encoding:字符集
standalone:表示是否是独立存在的xml文档:yes代表当前xml文件依赖于自己的dtd约束或者schream约束,为no代表依赖于外部的约束

标签:<标签名 属性名="属性值" 属性名="属性值"....>子标签或者文本</标签名>
<标签名 属性名="属性值"/> 省略结束标签

根标签:1.是所有其他标签的父标签2.一个xml文件有且只有一个根标签
-->
<!DOCTYPE threeking[
<!-- 定义元素 -->
<!ELEMENT threeking (country+)>
<!ELEMENT country (hero+)>
<!ELEMENT hero (#PCDATA)>
<!-- 定义属性 -->
<!ATTLIST country name CDATA "无名小国">
<!ATTLIST hero name CDATA "无名小将">
<!ATTLIST hero weapon CDATA "新兵矛">
]>
<!-- 导入外部dtd约束 -->
<!-- <!DOCTYPE threeking SYSTEM "king.dtd"> -->

<!-- 根节点 -->
/*1、编写一个xml文件把如下数据进行描述
【用户信息】
名字     工作    年龄
刘德华  演戏    20
科比      演戏    25
任良飞  炒股    18
*/
<Threeking>
	<!-- 子节点 -->
	<country worker="员工">
		<hero name="刘德华" work="演戏" age="20"> </hero>
		<hero name="科比" work="演戏" age="25"> </hero>
		<hero name="任良飞" work="炒股" age="18"> </hero>
	</country>
<Threeking>

二:xml解析: 先由xml分析器对xml进行分析,应用程序通过调用分析器提供的dom接口或者sax接口从而间接的实现了对xml                                   的 访问

                      1:dom解析:document object model;读取xml内容,然后生成文档树

                                      优点:内存中生成了文档树,所以可以方便的文档的任意节点进行操作

                                      缺点:内存中中生成了文档树,需要消耗的内存较大

          步骤:(1)建立DocumentBuilderFactory工厂:DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

                      (2)建立DocumentBuilder解析器:DocumentBuilder builder = factory.newDocumentBuilder();

                      (3)建立Document对象:Document doc= builder.parse("要读取的文件路径");

                      (4)建立NodeList:NodeList nl = doc.getElementsByTagName("读取节点");

                      (5)进行XML信息读取。

import javax.xml.parsers.ParserConfigurationException;

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

public class Test1Dom {
	public static void main(String[] args) {
		test1();
	}
	//测试dom解析xml文档
	private static void test1() {
		//(1)建立DocumentBuilderFactory工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		
		//定义解析器
		DocumentBuilder builder = null;
		Document document = null;
		try {
			//2、通过解析器工厂生产解析器
			builder = factory.newDocumentBuilder();
			//3、解析xml文档,得到document对象
			document = builder.parse(new File("src/com/cdsxt/day21/XML/ThreeKing.xml"));
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		//4、获取指定的结点集合
		NodeList nodes = document.getElementsByTagName("hero");
		//遍历集合取出结点
		for(int i=0;i<=nodes.getLength()-1;i++) {
			//根据下标来获取结点
			Node node = nodes.item(i);
			//将结点转化为元素结点
			Element element = (Element)node;
			//获取元素结点的相关属性
			String name = element.getAttribute("name");//获取name属性
			//获取weapon属性
			String weapon = element.getAttribute("weapon");
			//获取中间的文本内容
			String title = element.getTextContent();
			System.out.println("姓名:"+name+",使用的武器:"+weapon+",名号:"+title);
		}
	}
}

                      2:sax解析:simple api for xml;流式解析;一边读取,一边解析;解析的过程中并不保存具体的文件内容

                                   优点:边读边取,对内存消耗较小

                                  缺点:没有保存文档,不能随机访问节点

package com.cdsxt.day21.XML;

import java.io.File;
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.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class Test2SAX {
	/*
	 *  如果在开发中想要使用SAX解析,则首先应该编写一个SAX解析器:定义一个类,并使该类继承自DefaultHandler类,同时重写上述的表中的方法即可。
		建立完SAX解析器后,还需要建立SAXParserFactory和SAXParser对象,之后通过SAXPaeser的parse()方法指定要解析的XML文件和指定的SAX解析器。
	 */
	public static void main(String[] args) {
		test1();
	}
	//测试sax解析
	private static void test1() {
		//1、获取sax解析器工厂
		SAXParserFactory factory = SAXParserFactory.newInstance();
		//2、获取sax解析器
		SAXParser parser = null;
		//创建MyHandler对象
		Myhandler mh = new Myhandler();
		try {
			parser = factory.newSAXParser();
			//3、解析xml文档
			parser.parse(new File("src/com/cdsxt/day21/XML/ThreeKing.xml"), mh);
		} catch (ParserConfigurationException | SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		//获取读取的内容
		List<Hero> list = mh.list;
		//System.out.println(list);
		for (Hero hero : list) {
			System.out.println("三国名将:"+hero.name+",使用的武器:"+hero.weapon);
		}
	}
}
//定义一个类,并使该类继承自DefaultHandler类
class Myhandler extends DefaultHandler{
	//定义一个list集合
	List<Hero> list = new ArrayList<Hero>();
	//定义Hero属性
	Hero hero;
	
	//读取到元素结点开始时所触发的事件
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		//qName:表示读取到的元素结点的标签名
		//attributes:表示读取到的元素的属性
		//只需要处理元素结点为hero的结点
		if("hero".equals(qName)) {
			//获取该结点的属性
			String name = attributes.getValue("name");
			String weapon  = attributes.getValue("weapon");
			hero = new Hero(name, weapon);
			//放入list集合
			list.add(hero);
		}
	}
	//读取到文本结点时所触发的事件
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		//设置title属性
		if(hero!=null) {
			//将字符数组转换为字符串
			String title = new String(ch, start, length);
			//去除空白
			title = title.trim();
			hero.title = title;
			//将hero重置为null
			hero = null;
		}
	}
	
}
//定义Hero类
class Hero{
	String name;
	String weapon;
	String title;
	public Hero(String name, String weapon, String title) {
		super();
		this.name = name;
		this.weapon = weapon;
		this.title = title;
	}
	
	public Hero(String name, String weapon) {
		super();
		this.name = name;
		this.weapon = weapon;
	}

	public Hero() {
		super();
	}
	@Override
	public String toString() {
		return "Hero [name=" + name + ", weapon=" + weapon + ", title=" + title + "]";
	}
	
	
}

三:第三方工具

        jdom:结合了dom修改文件的优点和sax快速读取的优点

       dom4j:spring框架中使用dom4j进行xml解析

package com.cdsxt.day21.XML;

import java.io.File;
import java.io.IOException;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

public class Test3JDom {
	public static void main(String[] args) {
		test1();
	}
	//测试jdom解析xml文档
	private static void test1() {
		//1、jdom是一个第三方工具,使用时需要先导入其jar包。
		//2、创建解析器(其实是sax2的)
		SAXBuilder builder = new SAXBuilder();
		//3、解析xml文档
		Document document = null;
		try {
			document = builder.build(new File("src/com/cdsxt/day21/XML/ThreeKing.xml"));
		} catch (JDOMException | IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//获取结点:获取根节点
		Element root = document.getRootElement();
		//获取所有子节点
		List<Element> childs = root.getChildren();
		//遍历子节点
		for (Element child : childs) {
			//element:表示的是country结点
			//获取国家的名字
			String country = child.getAttributeValue("name");
			//获取当前country下的子节点
			List<Element> heros = child.getChildren();
			for (Element hero : heros) {
				//获取hero的属性
				String name = hero.getAttributeValue("name");
				String weapon = hero.getAttributeValue("weapon");
				//获取文本值
				String title = hero.getText();
				//打印结果
				System.out.println("三国演义:"+country+";猛将:"+name+",使用的武器:"+weapon+";绰号:"+title);
			}
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值