XML 学习

1、什么是XML

一、 XML是一种可扩展的标记语言
二、 XML设计的宗旨是用来传输数据的不是用来显示数据的
三、 XML具备自我描述性,并无固定的标签,都由本身来自定义,XML的标签较为严格,不容许有错。
四、 XML遵循w3c标准。
五、 XML的用途: 数据存储、数据传输、配置文件。
复制代码

2、基本语法

一、文档声明

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

二、规则

一、 标签必须闭合
二、 必须有跟元素包裹
三、 标签闭合要对应
四、 区分大小写
五、 属性要用双引号
六、 能够使用实体符号 &gt;等
复制代码

三、元素/标签命名规则

一、 命名能够包含字母、数字、符号
二、 不能以数字和符号开头
三、 名称不能包含空格
四、 不能以xml或XML或Xml开头
复制代码

四、文本

<?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>
复制代码

五、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>
复制代码

3、XML约束

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

- DTD约束
    - 本地dtd       <!DOCTYPE root SYSTEM "student.dtd">
    - 引用网络dtd   <!DOCTYPE root PUBLIC "//UNKNOWN/" "unknown.dtd">
    
- Schema
    - 为何要使用schema,由于若是咱们想要控制文本的类型,dtd就显得很差实现了,因此咱们使用了shcema,schema有dtd的功能,还能实现比dtd更多的功能。
复制代码
  • DTD解析

案例1java

// 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>
复制代码

案例2web

<?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

案例bash

// 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> 

复制代码

4、XML解析

一、XML树结构

节点分析以下:

二、DOM解析

认识DOM方式网络

DOM解析app

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
		// 一、建立解析器工厂
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		
		// 二、经过解析器工厂建立解析器
		DocumentBuilder db = dbf.newDocumentBuilder();
		
		// 三、经过解析器获得文档对象
		Document doc = db.parse("src/parse/student.xml");
		
		// 四、根据节点名称得到节点
		NodeList allStu = doc.getElementsByTagName("student");
		
		// 五、获取第一个学生
		Node n1 = allStu.item(0);
		
		System.out.println(n1.getTextContent()); // zjj21
		
	}

}

复制代码

DOM 操做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) {
		// 四、根据节点名称得到节点
		NodeList allStu = doc.getElementsByTagName("student");
		
		// 五、获取第一个学生
		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 {
		// 四、获取全部指定节点
		NodeList ageList = doc.getElementsByTagName("age");
		
		// 五、获取指定节点 
		Node n1 = ageList.item(0);
		
		// 六、修改节点内容
		n1.setTextContent("300");
		
		// 七、从内从更新到文件中
		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
		// 一、建立解析器工厂
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		
		// 二、经过解析器工厂建立解析器
		DocumentBuilder db = dbf.newDocumentBuilder();
		
		// 三、经过解析器获得文档对象
		Document doc = db.parse("src/parse/student.xml");
		test1(doc);
		test2(doc);
//		test3(doc);
//		test4(doc);
		test5(doc);
		
	}

}

复制代码

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

三、dom4j解析

dom4j使用步骤:jsp

使用案例:函数

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 教程

未完待续!!

相关文章
相关标签/搜索