目录

XML入门

xml语法

xml的标签

xml属性

xml的注释

xml文档声明

xml的转义字符         

CDATA块

处理指令

XML解析

Dom4j读取XML文件的常用方法

实现Dom4j读取XML文件de案例


 

  • XML入门

  1. HTML: 负责网页的结构       
  2. CSS: 负责网页的样式(美观)
  3. Javascript: 负责在浏览器端与用户进行交互。
  4. xml:Extend Markup Languge(可扩展标签语言)
  5. xml开发初衷试图替换html,但实际并不理想,所以xml也能实现html的某些功能,但一般不使用

Xml特点:

1.标签由开发者自己制定的(要按照一定的语法定义)

2.描述带关系的数据(作为软件的配置文件): 包含与被包含的关系   

<!--

web服务器(PC): 
学生管理系统 -> 添加学生功能 -> 添加学生页面 -> name=eric&[email protected]  
前提: 网络(IP地址: oracle:255.43.12.54  端口:1521 )
java代码:使用ip(255.43.12.54)地址和端口(1521),连接oracle数据库,保存学生数据。
把ip地址端口配置到xml文件:
-->
<host>
<ip>255.43.12.54<ip>
<prot>1521</port>
</host>

3.应用场景:tomcat   truts Hibernate spring (三大框架)

4.作为数据的载体(存储数据,小型的“数据库”)

<!--
教师管理系统: 	姓名   工龄+1  邮箱 
发教师数据给财务管理系统: 
String teacher = name=张三 & [email protected]&workage=2 字符串
(问题: 1)不好解析 2)不是规范)
-->
<theacher>
<name>张三</name>
<email>[email protected]&workage</eamil>
<workage>2</workage>
</theachr>

 

  • xml语法

  1. xml文件以xml后缀名结尾。
  2.  xml文件需要使用xml解析器去解析。浏览器内置了xml解析器

 

  • xml的标签

  1. xml标签名称区分大小写。
  2.    xml标签一定要正确配对。
  3.         xml标签名中间不能使用空格
  4.              xml标签名不能以数字开头
  5.                  注意: 在一个xml文档中,有且仅有一个根标签
  • xml属性

语法: <theacher name="eric">老师</theacher>

  1.  属性值必须写在成对的双引号中
  2.   一个标签中可以有多个属性,但属性名不能重复
  • xml的注释

<!-- 注释写在里面-->

 

  • xml文档声明

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

version: xml的版本号 encoding: 解析xml文件时查询的码表(解码过程时查询的码表)

 注意:

  1. 如果在ecplise工具中开发xml文件,保存xml文件时自动按照文档声明的encoding来保存文件。
  2.  如果用记事本工具修改xml文件,注意保存xml文件按照文档声明的encoding的码表来保存。

xml ---- JAVA进阶篇

  • xml常用的转义字符      

在xml中内置了一些特殊字符,这些特殊字符不能直接被浏览器原样输出。

如果希望把这些特殊字符按照原样输出到浏览器,对这些特殊字符进行转义。转义之后的字符就叫转义字节

特殊字符  转义字符

  1. <         &lt;
  2.  >         &gt;
  3.  "         &quot;
  4.   &         &amp;
  5.      空格      &nsbp;
<teacher>
<zifu> &lt;&lt;</zifu>
<zifu2>&gt;&gt;</zifu2>
<zifu3> &quot;&quot;</zifu3>
<zifu4> &amp; &amp;</zifu4>
<zifu5>&nsbp;&nsbp;</zifu5>
</teacher>

xml ---- JAVA进阶篇

 

  • CDATA块

作用: 可以让一些需要进行包含特殊字符的内容统一进行原样输出。

 

 

  • 处理指令

作用: 告诉xml解析 如何解析xml文档

 案例: <?xml-stylesheet type="text/css" href="1.css"?> 告诉xml解析该xml文档引用了哪个css文件

 需要提前xml内容可以使用xml-stylesheet指令指令

 

  • XML解析

程序读取xml文件的内容。这叫做xml解析

xml解析方式:

  • DOM解析(本质是面向对象的编程)

xml ---- JAVA进阶篇

  • SAX解析

解析工具

     1.DOM解析原理:(本质是一个jar包)

xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一颗Document的对象树,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到xml文档的内容。

  • JAXP (oracle-Sun公司官方)   官方的东西一般不好用
  • JDOM工具(非官方,不再JDK中需要手动导入)
  • Dom4J工具(非官方)常用
  • 三大框架(默认读取xml的工具就是Dom4

 

SAX解析原理:

Sax解析工具(oracle-sun公司官方)常用

 

  • Dom4j读取XML文件的常用方法

节点:Iterator  Element.nodeIterator();  //获取当前标签节点下的所有子节点

标签:

  •      Element  Document.getRootElement();  //获取xml文档的根标签             
  •      Element   ELement.element("标签名") //指定名称的第一个子标签
  •      Iterator<Element> Element.elementIterator("标签名");// 指定名称的所有子标签
  •       List<Element> Element.elements(); //获取所有子标签

属性:

  •            String   Element.attributeValue("属性名") //获取指定名称的属性值
  •             Attribute    Element.attribute("属性名");//获取指定名称的属性对象     
  •              Attribute.getName()  //获取属性名称
  •              Attibute.getValue()  //获取属性值
  •              List<Attribute>         Element.attributes();  //获取所有属性对象
  •            Iterator<Attribute>                   Element.attibuteIterator(); //获取所有属性对象

文本:

  •             Element.getText();  //获取当前标签的文本
  •              Element.elementText("标签名") //获取当前标签的指定名称的子标签的文本内容
  • 实现Dom4j读取XML文件de案例

package up.up.day;

import java.io.File;

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

/*
shift + ctrl +z 捕获异常
 入门   读xml文档
 
  范例:public class Foo {
    public Document parse(URL url) throws DocumentException {
        SAXReader reader = new SAXReader();
        Document document = reader.read(url);
        return document;
    }
}

 */
public class Demo01 {
	public static void main(String[] args) {
		
		try {
			//1.创建一个xml解析器对象
			SAXReader reader = new SAXReader();
			//2.读取xml文档,返回Document对象
			Document doc = reader.read(new File("./src/contact.xml"));
		System.out.println(doc);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			//抛出运行时异常
			throw new RuntimeException(e);
		}
}

}

 

package gz.itcast.a_dom4j_read;

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

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;

/**
 * 第二个dom4j读取xml文件内容 节点 标签 属性 文本
 * 
 * @author APPle
 * 
 */
public class Demo2 {

	/**
	 * 得到节点信息
	 */
	@Test
	public void test1() throws Exception {
		// 1.读取xml文档,返回Document对象
		SAXReader reader = new SAXReader();
		Document doc = reader.read(new File("./src/contact.xml"));

		// 2.nodeIterator: 得到当前节点下的所有子节点对象(不包含孙以下的节点)
		Iterator<Node> it = doc.nodeIterator();
		while (it.hasNext()) {// 判断是否有下一个元素
			Node node = it.next();// 取出元素
			String name = node.getName();// 得到节点名称
			// System.out.println(name);

			// System.out.println(node.getClass());
			// 继续取出其下面的子节点
			// 只有标签节点才有子节点
			// 判断当前节点是否是标签节点
			if (node instanceof Element) {
				Element elem = (Element) node;
				Iterator<Node> it2 = elem.nodeIterator();
				while (it2.hasNext()) {
					Node n2 = it2.next();
					System.out.println(n2.getName());
				}
			}
		}
	}

	/**
	 * 遍历xml文档的所有节点
	 * 
	 * @throws Exception
	 */
	@Test
	public void test2() throws Exception {
		// 1.读取xml文档,返回Document对象
		SAXReader reader = new SAXReader();
		Document doc = reader.read(new File("./src/contact.xml"));

		// 得到根标签
		Element rooElem = doc.getRootElement();

		getChildNodes(rooElem);

	}

	/**
	 * 获取 传入的标签下的所有子节点
	 * 
	 * @param elem
	 */
	private void getChildNodes(Element elem) {
		System.out.println(elem.getName());

		// 得到子节点
		Iterator<Node> it = elem.nodeIterator();
		while (it.hasNext()) {
			Node node = it.next();

			// 1.判断是否是标签节点
			if (node instanceof Element) {
				Element el = (Element) node;
				// 递归
				getChildNodes(el);
			}
		}
		;
	}

	/**
	 * 获取标签
	 */
	@Test
	public void test3() throws Exception {
		// 1.读取xml文档,返回Document对象
		SAXReader reader = new SAXReader();
		Document doc = reader.read(new File("./src/contact.xml"));

		// 2.得到根标签
		Element rootElem = doc.getRootElement();
		// 得到标签名称
		String name = rootElem.getName();
		System.out.println(name);

		// 3.得到当前标签下指定名称的第一个子标签
		/*
		 * Element contactElem = rootElem.element("contact");
		 * System.out.println(contactElem.getName());
		 */

		// 4.得到当前标签下指定名称的所有子标签
		/*
		 * Iterator<Element> it = rootElem.elementIterator("contact");
		 * while(it.hasNext()){ Element elem = it.next();
		 * System.out.println(elem.getName()); }
		 */

		// 5.得到当前标签下的的所有子标签
		List<Element> list = rootElem.elements();
		// 遍历List的方法
		// 1)传统for循环 2)增强for循环 3)迭代器
		/*
		 * for(int i=0;i<list.size();i++){ Element e = list.get(i);
		 * System.out.println(e.getName()); }
		 */

		/*
		 * for(Element e:list){ System.out.println(e.getName()); }
		 */
		/*
		 * Iterator<Element> it = list.iterator(); //ctrl+2 松开 l
		 * while(it.hasNext()){ Element elem = it.next();
		 * System.out.println(elem.getName()); }
		 */

		// 获取更深层次的标签(方法只能一层层地获取)
		Element nameElem = doc.getRootElement().element("contact")
				.element("name");
		System.out.println(nameElem.getName());

	}

	/**
	 * 获取属性
	 */
	@Test
	public void test4() throws Exception {
		// 1.读取xml文档,返回Document对象
		SAXReader reader = new SAXReader();
		Document doc = reader.read(new File("./src/contact.xml"));

		// 获取属性:(先获的属性所在的标签对象,然后才能获取属性)
		// 1.得到标签对象
		Element contactElem = doc.getRootElement().element("contact");
		// 2.得到属性
		// 2.1 得到指定名称的属性值
		/*
		 * String idValue = contactElem.attributeValue("id");
		 * System.out.println(idValue);
		 */

		// 2.2 得到指定属性名称的属性对象
		/*
		 * Attribute idAttr = contactElem.attribute("id"); //getName: 属性名称
		 * getValue:属性值 System.out.println(idAttr.getName() +"=" +
		 * idAttr.getValue());
		 */

		// 2.3 得到所有属性对象,返回LIst集合
		/*
		 * List<Attribute> list = contactElem.attributes(); //遍历属性 for
		 * (Attribute attr : list) {
		 * System.out.println(attr.getName()+"="+attr.getValue()); }
		 */

		// 2.4 得到所有属性对象,返回迭代器
		Iterator<Attribute> it = contactElem.attributeIterator();
		while (it.hasNext()) {
			Attribute attr = it.next();
			System.out.println(attr.getName() + "=" + attr.getValue());
		}

	}

	/**
	 * 获取文本
	 */
	@Test
	public void test5() throws Exception {
		// 1.读取xml文档,返回Document对象
		SAXReader reader = new SAXReader();

		Document doc = reader.read(new File("./src/contact.xml"));

		/**
		 * 注意: 空格和换行也是xml的内容
		 */
		String content = doc.getRootElement().getText();
		System.out.println(content);

		// 获取文本(先获取标签,再获取标签上的文本)
		Element nameELem = doc.getRootElement().element("contact")
				.element("name");
		// 1. 得到文本
		String text = nameELem.getText();
		System.out.println(text);

		// 2. 得到指定子标签名的文本内容
		String text2 = doc.getRootElement().element("contact")
				.elementText("phone");
		System.out.println(text2);

	}

}
package gz.itcast.a_dom4j_read;

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

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

/**
 * 把xml文档信息封装到对象中
 * @author APPle
 *
 */
public class Demo4 {

		public static void main(String[] args) throws Exception{
			List<Contact> list = new ArrayList<Contact>();
			
			//读取xml,封装对象
			SAXReader reader = new SAXReader();
			Document doc = reader.read(new File("./src/contact.xml"));
			//读取contact标签
			Iterator<Element> it = doc.getRootElement().elementIterator("contact");
			while(it.hasNext()){
				Element elem = it.next();
				//创建Contact
				Contact contact = new Contact();
				contact.setId(elem.attributeValue("id"));
				contact.setName(elem.elementText("name"));
				contact.setAge(elem.elementText("age"));
				contact.setPhone(elem.elementText("phone"));
				contact.setEmail(elem.elementText("email"));
				contact.setQq(elem.elementText("qq"));
				list.add(contact);
			}
			
			for (Contact contact : list) {
				System.out.println(contact);
			}
			
			
		}
}

 

相关文章: