XML相关

1.XML的简介

1.* XML 可扩展的标记语言。(和HTML非常类似的)

* 可扩展的。

* 自定义的标签。


2.* XML传输数据,HTML是显示数据。

2.XML的版本:

1.XML1.0(使用该版本) XML1.1(不向下兼容)

2.做什么用? 描述有关系的数据

3.应用

1* 作为配置文件。

2* 可以在系统与系统之间进行数据的传输。
* webserivice soap XML封装数据
* json 和XML概念

4.* XML的语法

4.1文档声明(*****)

4.1.1写法<?xml version="1.0" ?>

文档声明必须出现在xml文件的第一行和第一列的位置。

4.1.2属性:

* version="1.0" XML的版本 (必须写)

* encoding="UTF-8" 编码集 (可选的)

* standalone="yes或者no" 代表xml的文件是否是独立的。(如果是no,不独立,可以引入外部的文件)(可选的)

* 因为不写该属性,可以引入外部的文件。

4.1.3乱码会伴随你们一生?
* 产生的原因:保存文件时和打开文件时采用的编码不一致。

* 解决办法:保存文件可打开文件采用的编码一致就ok。(MyEclipse不会产生乱码问题)

4.2元素(***)

* 开始标签和结束标签。
* 包含标签主体: <abc>文本</abc>
* 不包含标签主体: <abc/>

* 不能交叉嵌套
* 只能有一个根元素(必须有,并且只能有一个)

* 命名规范:
* 区分大小写 错误的:<a></A> 代表两个标签
* 不能以数字和-中划线开头 错误的:<1a> <-a>
* 不能以XML(Xml XML xml)开头 错误的:<xmlaa>
* 不能包含空格和冒号。

4.3属性(***)

* 自定义:命名规范同上。
* 在同一个元素上,不能有相同的属性。(*****)
* 可以使用双引号或者单引号。

4.4注释(*)

* 和HTML的注释相同
<!-- XML的注释 -->

* 注释不能嵌套。

4.5特殊字符

* < &lt;
* > &gt;
* & &amp;
* " &quot;
* ' &apos;

4.6CDATA区

* 把标签中的内容作为字符串。
* 语法:
<![CDATA[
内容:当成字符串
]]>

4.7 PI(处理指令)(忘了)

* 替换HTML

5.XML的约束

* DTD
* schema

<myspring>
<bean>hello.java</bean>
<猫/><猫/>
</myspring>

* 格式良好的XML:遵循语法规范。
* 有效的XML:有约束。

6.* DTD的约束

6.1快速入门的步骤:

1* 需要出现哪些标签?

2* 在DTD的文件中编写元素
<!ELEMENT 元素名称 元素类型>

3* 判断元素是否是复杂还是简单元素?
* 如果是简单元素:(#PCDATA) 代表是字符串
* 如果是复杂元素:(子节点)

4* 需要在book.xml引入DTD的文件
* <!DOCTYPE 根节点 SYSTEM "DTD文件的地址">

6.2 DTD与XML文档的关联方式

1* 可以在XML的文件中直接书写DTD的代码。(经常使用)
<!DOCTYPE 根节点 [
DTD的代码
]>

2* 引入本地的DTD文件(经常使用
<!DOCTYPE 根节点 SYSTEM "DTD文件的地址">

3* 引入网络上的DTD文件
<!DOCTYPE 根节点 PUBLIC "DTD文件名称" "DTD文件的地址">

6.3 元素定义

1.* 语法:<!ELEMENT 元素名称 元素类型>

1)* (#PCDATA) 字符串
2)* EMPTY 空
3)* ANY 任意的
4)* (子元素)

* 子元素:
* 子元素之间的关系
, 子元素出现是有顺序的
| 子元素只能出现一个

* 子元素出现的次数
+ 子元素出现1次或多次
* 子元素出现0次或多次
? 子元素出现0次或1次

2.示例:<!ELEMENT MYFILE ( (TITLE*,AUTHOR?,EMAIL)* | COMMENT )>

<MYFILE>
<TITLE></TITLE>
<AUTHOR></AUTHOR>
<EMAIL></EMAIL>
<TITLE></TITLE>
<AUTHOR></AUTHOR>
<EMAIL></EMAIL>
<TITLE></TITLE>
<AUTHOR></AUTHOR>
<EMAIL></EMAIL>
</MYFILE>

6.4属性定义(AttributeList)

* 写法: <!ATTLIST 元素名称
属性名称 属性类型 属性约束
属性名称 属性类型 属性约束
>

* 属性类型
* CDATA 字符串
* 枚举(没有提供关键字) (男人|女人)
* ID 代表唯一的值,不能只写数字

* 属性的约束
* #REQUIRED 必须出现的
* #IMPLIED 可选的
* #FIXED 固定值 #FIXED "值"
* 默认值(不用)

*示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 书架 [
	<!ELEMENT 书架 (书+)>
	<!ELEMENT 书 (书名,作者,售价,简介)>
	<!ELEMENT 书名 (#PCDATA)>
	<!ELEMENT 作者 (#PCDATA)>
	<!ELEMENT 售价 (#PCDATA)>
	<!ELEMENT 简介 (#PCDATA)>
	
	<!ATTLIST 书
		出版社 (清华出版社|人民出版社) #REQUIRED
		编号 ID #IMPLIED
		出版日期 CDATA	#FIXED "2014-11-17"
	>
	
	<!ENTITY username "张三" >
	
]>

<书架>
	<书 出版社="清华出版社" 出版日期="2014-11-17">
		<书名>javaweb开发大全</书名>
		<作者>&username;</作者>
		<售价>99.8元</售价>
		<简介>这是不错啊</简介>
	</书>
	<书 编号="b1" 出版社="人民出版社">
		<书名>葵花宝典</书名>
		<作者>岳不群</作者>
		<售价>99.8两</售价>
		<简介>欲练此功...</简介>
	</书>
</书架>

6.5实体定义(用的不多)

* <!ENTITY 别名 "值" >
* 需要在xml中引入别名,浏览器打开文件后,在引入的位置上显示值的。

7.解析XML

1 * 解析XML的方式有哪些呢?
* 常用的有两种?DOM和SAX
* 区别:
DOM解析XML
* 在内存中形成树状结构
* 缺点:如果文档过大,容易产生内存溢出的问题。
* 优点:方便做增删改的操作

SAX解析
* 基于事件驱动,边读边解析
* 优点:不会产生内存溢出问题。
* 缺点:不能做增删改操作。(DOM4J在内存生成树状结构)




2* JAXP SUN提供的

:只能使用DOM方式,如果SAX,只能做查询。

3* DOM4J(*****)
* 想做增删改 企业都在用。DOM4J提供的
* 全部都可以做。


4 * JDOM(不讲了)

8. JAXP的解析HTML

1* DOM

* DocumentBuilderFactory :解析器工厂类
* DocumentBuilder 获取解析器对象
* 解析XML(Document parse(String uri) )

        // 获取解析器工厂类
	DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
	// 获取解析器对象
	DocumentBuilder builder = factory.newDocumentBuilder();
	// 解析XML的文档,返回document对象
	Document document = builder.parse("src/book2.xml");


2* 回写(代码方式固定)

* 获取回写的工厂类
* 获取回写对象
* 调用回写的方法进行回写。

                    // 创建回写类的工厂
                    TransformerFactory transformerFactory =  TransformerFactory.newInstance();
                    // 获取回写类
                    Transformer transformer = transformerFactory.newTransformer();
                    // 调用回写的方法
                    transformer.transform(new DOMSource(document),new StreamResult("src/book2.xml"));

3. 代码示例

1.工具类:JaxpDomUtil

package cn.itcast.utils;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;

/**
 * JAPTDOM解析的工具类
 * @author Administrator
 *
 */
public class JaxpDomUtil {
	
	/**
	 * 通过path获取document对象
	 * @param path
	 * @return
	 * @throws Exception
	 */
	public static Document getDocment(String path) throws Exception{
		//1.获取工厂类:
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		//2.获取解析器类;
		DocumentBuilder builder = factory.newDocumentBuilder();
		//解析xml文件,并返回
		return builder.parse(path);	
		
	}
	
	/**
	 * 回写到xml文件
	 * @throws Exception 
	 */
	public static void writeXML(Document document,String path) throws Exception{
		//1.获取回写类工厂
		TransformerFactory transformerFactory = TransformerFactory.newInstance();
		//2.获取回写类
		Transformer transformer = transformerFactory.newTransformer();
		//3. 回写
		transformer.transform(new DOMSource(document),new StreamResult(path));
	}
	
}

2.xml文件:

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

	<书>
		<书名>javaweb开发大全</书名>
		<作者>班长</作者>
		<售价>99.8元</售价>
		<简介>这是不错啊</简介>
	</书>
	<书>
		<书名>葵花宝典</书名>
		<作者>岳不群</作者>
		<售价>99.8两</售价>
		<简介>欲练此功...</简介>
		
	</书>
</书架>

3. 测试类:JaxpDomTest

package cn.itcast.jaxp;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
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 cn.itcast.utils.*;
/**
 * JAXP的DOM方式解析XML文件
 * @author Administrator
 *
 */

public class JaxpDomTest {
	
	public static void main(String[] args) {
		try {
			run3();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 解析xml文件,然后获取xml文件中作者标签的内容
	 * @throws Exception
	 */
	public static void run1() throws Exception{
		//1.先获取解析器工厂类对象实例:factory
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		//2.通过解析器工厂类来获取解析器对象
		DocumentBuilder builder = factory.newDocumentBuilder();
		//3.解析xml文档,返回document对象
		Document document = builder.parse("src/book2.xml");//uri
		//4.获取作者元素对象的集合,返回NodeList
		NodeList nodeList = document.getElementsByTagName("作者");
		//5.循环遍历,拿到每一个作者,打印文
		for(int i=0; i<nodeList.getLength(); i++){
			Node node = nodeList.item(i);
			String author = node.getTextContent();
			System.out.println(author);
			
		}
	}
	/**
	 * 需求:在第二本书下,末尾添加子结点
	 * @throws Exception 
	 */
	public static void run2() throws Exception{
		//1.获取工厂类
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		//2.获取解析器
		DocumentBuilder build = factory.newDocumentBuilder();
		//3.解析xml文档,返回document对象
		Document document = build.parse("src/book2.xml");
		
		//4.获取第二本书
		Node book2 = document.getElementsByTagName("书").item(1);
		//5.创建元素对象,
		Element cat = document.createElement("猫");
		//6.设置文本内容
		cat.setTextContent("我是猫");
		//7.将元素对象添加到第二本书
		book2.appendChild(cat);
		
		//8. 回写方式固定,如果不回写,就无法写回到xml文件中。
		  //8.1创建回写类工厂
		TransformerFactory transformerFactory = TransformerFactory.newInstance();
		  //8.2获取回写类
		Transformer transformer = transformerFactory.newTransformer();
		  //8.3调用回写方法
		transformer.transform(new DOMSource(document),new StreamResult("src/book2.xml"));
	}
	
	/**
	 * 删除结点:通过父结点删除子结点,即要通过待删除结点的父结点来删除结点
	 * @throws Exception 
	 */
	public static void run3() throws Exception{
		String path = "src/book2.xml";
		//获取文档对象;
		Document document = JaxpDomUtil.getDocment(path);
		//获取猫
		Node cat = document.getElementsByTagName("猫").item(0);
		//获取书(猫的父结点)
		Node book2 = cat.getParentNode();
		//通过书删除猫
		book2.removeChild(cat);
		//回写
		JaxpDomUtil.writeXML(document,path);
	}
}



版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇