XML 学习

272 阅读7分钟

一、什么是XML

1、 XML是一种可扩展的标记语言
2、 XML设计的宗旨是用来传输数据的不是用来显示数据的
3、 XML具有自我描述性,并没有固定的标签,都由自己来自定义,XML的标签较为严格,不允许有错。
4、 XML遵循w3c标准。
5、 XML的用途: 数据存储、数据传输、配置文件。

二、基本语法

1、文档声明

<?xml version="1.0" encoding="UTF-8"?> <!-- 文档申明 -->
// 版本号 + 编码方式 
// 该句话必须放置在第一行

2、规则

1、 标签必须闭合
2、 必须有跟元素包裹
3、 标签闭合要对应
4、 区分大小写
5、 属性要用双引号
6、 可以使用实体符号 &gt;等

3、元素/标签命名规则

1、 命名可以包含字母、数字、符号
2、 不能以数字和符号开头
3、 名称不能包含空格
4、 不能以xml或XML或Xml开头

4、文本

<?xml version="1.0" encoding="UTF-8"?> <!-- 文档申明 -->

<teamp>
	<person>
		<name>zjj</name>
		<age>22</age>
		<gao>
			<abc>aaa</abc>
		</gao>
	</person>
	
</teamp>

// 原样子输出
<?xml version="1.0" encoding="UTF-8"?> <!-- 文档申明 -->

<teamp>
	<person>
		<name>zjj</name>
		<age>22</age>
		// 原样子输出
		<![CDATA[
			<abc>aaa</abc>
		]]>
	</person>
	
</teamp>

5、XML树结构

<bookstore>
<book category="COOKING">
  <title lang="en">Everyday Italian</title> 
  <author>Giada De Laurentiis</author> 
  <year>2005</year> 
  <price>30.00</price> 
</book>
<book category="CHILDREN">
  <title lang="en">Harry Potter</title> 
  <author>J K. Rowling</author> 
  <year>2005</year> 
  <price>29.99</price> 
</book>
<book category="WEB">
  <title lang="en">Learning XML</title> 
  <author>Erik T. Ray</author> 
  <year>2003</year> 
  <price>39.95</price> 
</book>
</bookstore>

三、XML约束

规定文档中只能些哪些标签,会报错提示。

- DTD约束
    - 本地dtd       <!DOCTYPE root SYSTEM "student.dtd">
    - 引用网络dtd   <!DOCTYPE root PUBLIC "//UNKNOWN/" "unknown.dtd">
    
- Schema
    - 为什么要使用schema,因为如果我们想要控制文本的类型,dtd就显得不好实现了,所以我们使用了shcema,schema有dtd的功能,还能实现比dtd更多的功能。
  • DTD解析

案例1

// student.dtd

<!ELEMENT students (student*)>
<!ELEMENT student (name, age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>
// student.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root SYSTEM "student.dtd">

<root>
	<students>
		<student number="s001">
			<name>zjj</name>
			<age>21</age>
		</student>
	</students>
	
	<students>
		<student number="s002">
			<name>zjj</name>
			<age>21</age>
		</student>
	</students>
	
	<person>
		<cat>ccc</cat>
	</person>
</root>

案例2

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

<!DOCTYPE root SYSTEM "web-app.dtd">

<root>
	<web-app>
		<servelt>
			<servelt-name>name</servelt-name>
			<servelt-class>aaaaa</servelt-class>
		</servelt>
		
		<servelt>
			<servelt-name>name</servelt-name>
			<servelt-class>aaaaa</servelt-class>
		</servelt>
		
		<servelt-mapping>
		
		</servelt-mapping>
		
		<servelt-mapping>
		
		</servelt-mapping>
		
		<wel-file-list>
			<welcome-file>aaa</welcome-file>
		</wel-file-list>
	</web-app>
</root>
<! ELEMENT web-app (servelt*, servelt-mapping*, wel-file-list?)>
<! ELEMENT servelt (servelt-name, description?, (servelt-class|jsp-file))>
<! ELEMENT servelt-name (#PCDATA)>
<! ELEMENT welcome-file-list (welcome-file+)>


  • 使用schema

案例

// student.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--
开始使用的步骤:
1.编写根标签				students
2.引用约束地址            xsi:schemaLocation="默认空间    约束地址.xsd"
3.引用实例名称空间     	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4.默认名称空间      		xmlns="http://www.it666.cn/xml"

-->

<students   xsi:schemaLocation="http://www.it666.cn/xml   student.xsd"
	        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	        xmlns="http://www.it666.cn/xml">

<student number="lk_0001">
	<name>aa</name>
	<age>50</age>
	<sex>male</sex>
</student>


</students>
// student.xsd

<?xml version="1.0"?>

<!-- 定义schema根元素,指定默认空间、实例名称空间等 -->
<xsd:schema xmlns="http://www.it666.cn/xml"
        	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        	targetNamespace="http://www.it666.cn/xml" elementFormDefault="qualified">
        	
        	
    <!-- 定义一个标签(元素element) -->
    <xsd:element name="students" type="studentsType"/>  <!-- type为别名 -->
    <!-- 定义一个标签 -->
    
    
    
    <!-- 定义一个复杂类型(复杂标签:标签当中还有子标签) name指明了别名-->
    <xsd:complexType name="studentsType">
    	<!-- sequence表示必须按照顺序 -->
        <xsd:sequence>
        	<!-- students 里面可以包含student元素,可以是0个,最大是无限个 -->
            <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
        <!-- 必须按照顺序 -->
    </xsd:complexType>
    <!-- 定义一个复杂类型(复杂标签:标签当中还有子标签) -->
    
    
    <!-- 复杂类型 -->
    <xsd:complexType name="studentType">
        <xsd:sequence>
            <xsd:element name="name" type="xsd:string"/>
            <xsd:element name="age" type="ageType" />
            <xsd:element name="sex" type="sexType" />
        </xsd:sequence>
        
        <!-- 别名是studentType的标签包含的属性 -->
        <!-- 名称是number,类型是numberType,必须包含 -->
        <xsd:attribute name="number" type="numberType" use="required"/>
        <!-- 别名是studentType的标签包含的属性 -->
        
    </xsd:complexType>
    <!-- 复杂类型 -->
    
    <!-- =============下面指明了类型的详情============== -->
    
    
    <!-- 简单类型: 简单标签(标签当中没有子标签了) -->
    <!-- sex类型: 字符串、枚举 male 和 female -->
    <xsd:simpleType name="sexType">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="male"/>
            <xsd:enumeration value="female"/>
        </xsd:restriction>
    </xsd:simpleType>
    <!-- 简单类型 -->
    
    <!-- 简单类型 -->
    <!-- age类型:整形、最小是0,最大是256 -->
    <xsd:simpleType name="ageType">
        <xsd:restriction base="xsd:integer">
            <xsd:minInclusive value="0"/>
            <xsd:maxInclusive value="256"/>
        </xsd:restriction>
    </xsd:simpleType>
    <!-- 简单类型 -->
    
    <!-- 简单类型 -->
    <!-- number类型:字符串、正则匹配必须正确 -->
    <xsd:simpleType name="numberType">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="lk_\d{4}"/>
        </xsd:restriction>
    </xsd:simpleType>
    <!-- 简单类型 -->
    
</xsd:schema> 

四、XML解析

1、XML树结构

节点分析如下:

2、DOM解析

认识DOM方式

DOM解析

package parse;

// 导入
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;


public class ParseClass {
	
	
	
	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
		// TODO Auto-generated method stub
		// 1、创建解析器工厂
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		
		// 2、通过解析器工厂创建解析器
		DocumentBuilder db = dbf.newDocumentBuilder();
		
		// 3、通过解析器得到文档对象
		Document doc = db.parse("src/parse/student.xml");
		
		// 4、根据节点名称获得节点
		NodeList allStu = doc.getElementsByTagName("student");
		
		// 5、获取第一个学生
		Node n1 = allStu.item(0);
		
		System.out.println(n1.getTextContent()); // zjj21
		
	}

}

DOM 操作

package parse;

import java.io.IOException;

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

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 ParseClass {
	
	
	
	/**
	 * 获取节点内容
	 * @param doc
	 */
	public static void test1(Document doc) {
		// 4、根据节点名称获得节点
		NodeList allStu = doc.getElementsByTagName("student");
		
		// 5、获取第一个学生
		Node n1 = allStu.item(0);
		
		System.out.println(n1.getTextContent()); // zjj21
	}
	
	/**
	 * 修改节点内容
	 * @param doc
	 * @throws TransformerFactoryConfigurationError 
	 * @throws Exception 
	 */
	public static void test2(Document doc) throws TransformerFactoryConfigurationError, Exception {
		// 4、获取所有指定节点
		NodeList ageList = doc.getElementsByTagName("age");
		
		// 5、获取指定节点 
		Node n1 = ageList.item(0);
		
		// 6、修改节点内容
		n1.setTextContent("300");
		
		// 7、从内从更新到文件中
		Transformer tf = TransformerFactory.newInstance().newTransformer();
		tf.transform(new DOMSource(doc), new StreamResult("src/parse/student.xml"));
	}
	
	/**
	 * 添加节点
	 * @param doc
	 * @throws TransformerFactoryConfigurationError
	 * @throws Exception
	 */
	static void test3(Document doc) throws Exception, TransformerFactoryConfigurationError {
		 // 创建一个元素
		 Element element = doc.createElement("address");
		 
		 // 设置内容
		 element.setTextContent("address");
		 
		 // 插入
		 Node stuNode = doc.getElementsByTagName("student").item(0);
		 stuNode.appendChild(element);
		 
		 
		 // 从内从更新到文件中
		 Transformer tf = TransformerFactory.newInstance().newTransformer();
		 tf.transform(new DOMSource(doc), new StreamResult("src/parse/student.xml"));
	}
	
	/**
	 * 删除节点
	 * @param doc
	 * @throws Exception
	 * @throws TransformerFactoryConfigurationError
	 */
	static void test4(Document doc) throws Exception, TransformerFactoryConfigurationError {
		Node addressNode = doc.getElementsByTagName("address").item(0);
		addressNode.getParentNode().removeChild(addressNode);
		Transformer tf = TransformerFactory.newInstance().newTransformer();
		tf.transform(new DOMSource(doc), new StreamResult("src/parse/student.xml"));
	}
	
	/**
	 * 设置属性
	 * @param doc
	 * @throws Exception
	 * @throws TransformerFactoryConfigurationError
	 */
	static void test5(Document doc) throws Exception, TransformerFactoryConfigurationError {
		Node stu = doc.getElementsByTagName("student").item(1);
		Element ele = (Element)stu;
		ele.setAttribute("ID", "00001");
		Transformer tf = TransformerFactory.newInstance().newTransformer();
		tf.transform(new DOMSource(doc), new StreamResult("src/parse/student.xml"));	
	}
	
	/**
	 * 主函数
	 * @param args
	 * @throws TransformerFactoryConfigurationError
	 * @throws Exception
	 */
	public static void main(String[] args) throws TransformerFactoryConfigurationError, Exception {
		// TODO Auto-generated method stub
		// 1、创建解析器工厂
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		
		// 2、通过解析器工厂创建解析器
		DocumentBuilder db = dbf.newDocumentBuilder();
		
		// 3、通过解析器得到文档对象
		Document doc = db.parse("src/parse/student.xml");
		test1(doc);
		test2(doc);
//		test3(doc);
//		test4(doc);
		test5(doc);
		
	}

}

但是目前都不使用该种方法了,因为这种方法是java自带的,由sun公司推出的。

3、dom4j解析

dom4j使用步骤:

使用案例:

package dom4j;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.util.List;

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

public class Test {
	/**
	 * 写入信息
	 * @throws Exception
	 * @throws FileNotFoundException
	 */
	static void test() throws Exception, FileNotFoundException {
		// 创建解析器
		SAXReader reader = new SAXReader();
        Document doc = reader.read("src//dom4j//student.xml");
		// 获取根元素
        Element rootElement = doc.getRootElement();
		// 创建元素,设置属性并添加进去
        Element stuEle = rootElement.addElement("student").addAttribute("number", "a0003");
        
        // 设置文本信息
		stuEle.addElement("name").setText("zjjjj");	 
		stuEle.addElement("age").setText("30");	 
		stuEle.addElement("sex").setText("男");	 
		
		// 格式化输出到xml文件中去
        OutputFormat format = OutputFormat.createPrettyPrint();
        Writer wr = new OutputStreamWriter(new FileOutputStream("src//dom4j//student.xml"),"UTF-8");
        XMLWriter writer = new XMLWriter(wr, format);
        writer.write( doc );
        wr.close();
	}
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("-----");
		// 创建SAXReader解析器
		SAXReader reader = new SAXReader();
        Document document = reader.read("src//dom4j//student.xml");
        
        // 获取根元素
        Element root = document.getRootElement();
        
        // 获取指定元素,返回集合
        List <Element> list = root.elements("student");
        // 遍历
        for (Element element : list) {
			String name = element.elementText("name");
			String age = element.elementText("age");
			String num = element.attributeValue("number");
			System.out.println(name);
			System.out.println(age);
			System.out.println(num);
		}
        
        test();
	}

}

java XML 教程

未完待续!!