XML入门

XML介绍与用途

XML文件的概念及与html的不同

4JbxV1.png
4JbXr9.png

XML文档主要用意就是用来保存数据,这是与html的根本不同

XML的用途

  • java程序的配置描述文件
  • 用于保存程序的产生的数据
  • 网络间的数据传输

XML的语法规则

XML文档结构

  • 第一行必须是XML声明
  • 有且只有一个根节点
  • XML标签的书写规则与HTML相同

XML声明

4JbjbR.png

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 人力资源管理系统 -->
<hr>
    <employee no="3309">
        <name>张三</name>
        <age>31</age>
        <salary>4000</salary>
        <departtment>
            <dname>会计部</dname>
            <address>XX大厦-B103</address>
        </departtment>
    </employee>

    <employee no="3310">
        <name>李四</name>
        <age>23</age>
        <salary>3000</salary>
        <departtment>
            <dname>工程部</dname>
            <address>XX大厦-B104</address>
        </departtment>
    </employee>
</hr>

XML标签书写规则

  1. 合法的标签名

    • 标签名要有意义
    • 建议使用英文,小写字母,单词之间用“-”分割
    • 建议多级标签之间不要存在重名的情况
  2. 适当的注释与缩进可以让XML文档更容易阅读

  3. 合理使用属性

    • 标签属性用于描述标签不可获取的信息
    • 对标签分组或者为标签设置Id时常用属性表示
  4. 处理特殊字符,标签体中,出现"<",">"特殊字符,会破坏文档结构

    • 方案1:使用实体引用(只适用于文档中特殊符号比较少的情况)

4JqS56.png

  • 方案2:使用CDATA标签

4JbzUx.png
4Jq9PK.png
5. 在XML多层嵌套的子元素中,标签前后顺序应保持一致

4JqP2D.png

XML语义约束

  • XML文档结构正确,但可能不是有效的
    • 例如,员工档案XML中不允许出现“植物品种”标签。XML语义约束就是用于规定XML文档中允许出现哪些元素
  • XML语义约束有两种定义方式:DTD与XML Schema

DTD

  • 全称是EXtensible Markup Language,可扩展标记语言

  • DTD文件的扩展名为:.dtd

4JqC8O.png

  1. DTD定义节点

4JqkKH.png

  1. DTD定义节点数量

4Jqixe.png

XML引用DTD文件

4JqArd.png

创建DTD文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hr SYSTEM "hr.dtd">
<!-- 人力资源管理系统 -->
<hr>
    <employee no="3309">
        <name>张三</name>
        <age>31</age>
        <salary>4000</salary>
        <department>
            <dname>会计部</dname>
            <address>XX大厦-B103</address>
        </department>
    </employee>

    <employee no="3310">
        <name>李四</name>
        <age>23</age>
        <salary>3000</salary>
        <department>
            <dname>工程部</dname>
            <address>XX大厦-B104</address>
        </department>
    </employee>
</hr>

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT hr (employee+)>
<!ELEMENT employee (name,age,salary,department)>
<!ATTLIST employee no CDATA "">
<!ELEMENT name (#PCDATA)
<!ELEMENT age (#PCDATA)
<!ELEMENT salary (#PCDATA)
<!ELEMENT department (dname,address)>
<!ELEMENT dname (#PCDATA)
<!ELEMENT address (#PCDATA)

XML Schema

  • XML Schema比DTD更为复杂,提供了更多功能。
  • XML Schema 提供了数据类型、格式限定、数据范围等特性。
<?xml version="1.0" encoding="UTF-8"?>
<!-- 人力资源管理系统 -->
<hr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="hr.xsd">
	<employee no="3309">
		<name>张三</name>
		<age>31</age>
		<salary>4000</salary>
		<department>
			<dname>会计部</dname>
			<address>XX大厦-B103</address>
		</department>
	</employee>
	<employee no="3310">
		<name>李四</name>
		<age>23</age>
		<salary>3000</salary>
		<department>
			<dname>工程部</dname>
			<address>XX大厦-B104</address>
		</department>
	</employee>
</hr>
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
	<element name="hr">
		<!-- complexType标签含义是复杂节点,包含子节点时必须使用这个标签 -->
		<complexType>
			<sequence>
				<element name="employee" minOccurs="1" maxOccurs="9999">
					<complexType>
						<sequence>
							<element name="name" type="string"></element>
							<element name="age">
								<simpleType>
									<restriction base="integer">
										<minInclusive value="18"></minInclusive>
										<maxInclusive value="60"></maxInclusive>
									</restriction>
								</simpleType>
							</element>
							<element name="salary" type="integer"></element>
							<element name="department">
								<complexType>
									<sequence>
										<element name="dname" type="string"></element>
										<element name="address" type="string"></element>
									</sequence>
								</complexType>
							</element>
						</sequence>
						<attribute name="no" type="string" use="required"></attribute>					
					</complexType>
				</element>
			</sequence>
		</complexType>
	</element>	
</schema>

Java解析XML

DOM模型与Dom4j

DOM模型

DOM定义了访问和操作XML文档的标准方法,DOM把XML文档作为树结构来查看,能够通过DOM树来读写所有元素

4JqZVI.png

Dom4j

4JqEqA.png

Dom4j遍历XML
package com.imooc.dom4j;

import java.util.List;

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

public class HrReader {
	public void readXml(){
		String file = "D:\\IdeaProjects\\XML\\src/hr.xml";
		//SAXReader类是读取XML文件的核心类,用于将XML解析后以"树"的形式保存在内存中。
		SAXReader reader = new SAXReader();
		try {
			Document document = reader.read(file);
			//获取XML文档的根节点,即hr标签
			Element root = document.getRootElement();
			//elements方法用于获取指定的标签集合
			List<Element> employees =  root.elements("employee");
			for(Element employee : employees){
				//element方法用于获取唯一的子节点对象
				Element name = employee.element("name");
				String empName = name.getText();//getText()方法用于获取标签文本
				System.out.println(empName);
				System.out.println(employee.elementText("age"));
				System.out.println(employee.elementText("salary"));
				Element department = employee.element("department");
				System.out.println(department.element("dname").getText());
				System.out.println(department.element("address").getText());
				Attribute att = employee.attribute("no");
				System.out.println(att.getText());
			}
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		HrReader reader = new HrReader();
		reader.readXml();
	}
	
}
张三
78
4000
会计部
XX大厦-B103
3309
李四
23
3000
工程部
XX大厦-B104
3310
Dom4j更新XML
package com.imooc.dom4j;

import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;

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

public class HrWriter {
	public void writeXml(){
		String file = "D:\\IdeaProjects\\XML\\src/hr.xml";
		SAXReader reader = new SAXReader();
		try {
			Document document = reader.read(file);
			Element root = document.getRootElement();
			Element employee = root.addElement("employee");
			employee.addAttribute("no", "3311");
			Element name = employee.addElement("name");
			name.setText("李铁柱");
			employee.addElement("age").setText("37");
			employee.addElement("salary").setText("3600");
			Element department = employee.addElement("department");
			department.addElement("dname").setText("人事部");
			department.addElement("address").setText("XX大厦-B105");
			Writer writer = new OutputStreamWriter(new FileOutputStream(file) , "UTF-8");
			document.write(writer);
			writer.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		HrWriter hrWriter = new HrWriter();
		hrWriter.writeXml();
	}
}

Xpath路径表达式

  • XPath路径表达式是XML文档中查找数据的语言
  • 掌握XPath可以极大地提高在提取数据时的开发效率
  • 学习XPath本质就是掌握各种形式表达时的使用技巧

4Jqeat.png
4JqmIP.png
4JquPf.png

Jaxen介绍

4JqKG8.png

package com.imooc.dom4j;

import java.util.List;

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

public class XPathTestor {
	public void xpath(String xpathExp){
		String file = "D:\\IdeaProjects\\XML\\src\\hr.xml";
		SAXReader reader = new SAXReader();
		try {
			Document document = reader.read(file);
			
			List<Node> nodes = document.selectNodes(xpathExp);
			for(Node node : nodes){
				Element emp = (Element)node;
				System.out.println(emp.attributeValue("no"));
				System.out.println(emp.elementText("name"));
				System.out.println(emp.elementText("age"));
				System.out.println(emp.elementText("salary"));
				System.out.println("==============================");
			}
			
			
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		XPathTestor testor = new XPathTestor();
//		testor.xpath("/hr/employee");
//		testor.xpath("//employee");
//		testor.xpath("//employee[salary<4000]");
//		testor.xpath("//employee[name='������']");
//		testor.xpath("//employee[@no=3304]");
//		testor.xpath("//employee[1]");
//		testor.xpath("//employee[last()]");
		//testor.xpath("//employee[position()<3]");
		testor.xpath("//employee[3] | //employee[8]");// 取出第三个和第八个员工
		
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值