笔记--xml简介

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>

</body>
<script type="text/javascript">
/*
*XML
	*简介
		*XML:可扩展的标记语言
			*可扩展的
			*自定义的标签
		*XML传输数据,HTML显示数据
	*XML版本:XML1.0  XML1.1(不向下兼容)
		*不向下兼容,就是之前开发的版本,后面系统更新之后,不能用之前开发的版本;额
	*用处?
		*描述有关系的数据
	*应用:
		*作为配置文件
			*
		*在系统之间进行数据的传输
			*
	*XML的语法
		*文档声明(*****)
			*写法:<?xml version="1.0" ?>
			*文档声明必须出现在xml文件的第一行和第一列的位置
			*属性
				*version:xml版本1.0(必须写)
				*encoding:编码方式utf-8(可选)
				*standalone:代表xml文件是否是独立的yes or no(可选的) 
					*鸡肋,因为不写该属性,也可以引入外部文件
		*元素(***)
			*开始标签和结束标签
				*包含标签主体 <abc>abc</abc>
				*不包含标签主体  <abc/>
			*不能交叉嵌套
			*有且只能有一个根元素
			*命名规范
				*区分大小写
				*不能以数据和中划线开头
				*不能以xml的任何形式开头
				*不能包含空格和冒号
		*属性(***)
			*自定义:命名规范同上
			*在同一个元素上,不能有相同的属性
			*可以使用双引号或者单引号
		*注释(*)
			*和HTML注释相同
			*<!-- 注释 -->
			*注释不能嵌套
		*CDATA区:character data
			*把标签中的内容作为字符串,即特殊字符可以直接打印,不用转译
			*语法
				*<![[CDATA]
					内容:当成字符串
				]>
		*特殊字符
			*< <
			*> >
			*& &
			*" "
			*' &apos
		*PI(处理指令)
			*替换HTML
	*XML的约束
		*DTD
			*格式良好的xml:遵循语法规范 
			*有效的xml :有约束
			*快速入门的步骤:
				*需要哪些标签
				*在DTD文件中编写元素
					*<!ELEMENT 元素名称 (元素类型)>
				*判断元素是否是复杂还是简单元素
					*简单元素:(#PCDATA)代表字符串
					*复杂元素:子节点
				* 需要在xml文件中引入DTD文件
					*<!DOCTYPE 根节点 SYSTEM "dtd文件">
			*DTD与XML文件的关联方式
				*在XML文档中直接书写DTD的代码
					*<!DOCTYPE 根节点 [DTD代码]>
				*引入本地的DTD文件
				*引入网络上的DTD文件(不常见)
					**<!DOCTYPE 根节点 PUBLIC "dtd文件名" "DTD文件地址">
		*DTD语法:
			*元素定义:
				*语法:<!ELEMENT 元素名称 元素类型>
					*元素类型:*(#PCDATA):可解析的字符数据
							   *EMPTY:空的
							   *ANY:任意,文本或者子节点都可以
							   *(子元素):
							   
							   *子元素之间的关系:
								* ,:子元素的出现是有顺序的
								* | :子元素只能出现一个
							   *子元素出现的次数;
								* + :出现0次或者多次
								* | :出现0次或多次
								* ? :出现0次或1次
			*属性(AttibuteList)定义
				*写法:<!ATTLIST 元素名称 
							属性名称 属性类型 属性约束
							属性名称 属性类型 属性约束
							属性名称 属性类型 属性约束
							......
						>
				*属性类型
					*CDATA  字符串
					*枚举(没有提供关键字) (eg:男人|女人)
					*ID:代表唯一的值,不能只写数字
				*属性约束:
					* #REQUIRED:必须出现的
					* #IMPLIED:可选的
					* #FIXED固定值
					* 默认值(不用)
			*实体定义:ENTITY
				*<!ENTITY 别名 "值">
				*需要在xml中引入引用别名,浏览器打开文件后,在引入的位置上显示值
				*引用实体:&别名		
		*schema
	*解析XML
		*解析XML的方式?
			*常用DOM和SAX
				*大体方向上的解析技术,虽然很多公司推出了自己的开发包,但是很多开发包都支持者两种技术
			*区别:
				*DOM:
					*在内存中形成树状结构
					*缺:文档过大时,容易产生内存溢出的问题,因为会把xml整个文档加载进内存
					*优:方便做CRUD操作
				*SAX:
					*基于事件驱动,边读边解析
					*优:不会产生内存溢出
					*缺:不能做CRUD操作(DOM4J在内存生产树状结构)
		*JAXP       SUN提供
			*Document:代表整个文档
			*Element:元素
			*Attr:属性
			*Text:文本
			*Node:节点
			
			
		*DOM4J      企业都在用,DOM4J提供
		*JDOM(现在基本不用了)
		
		*DOM:
			*DocumentBuilderFactory:解析器工厂类
			*DocumentBuilder:获取解析器对象
			*解析XML(Document parse(String uri)):
		*SAX:
			*
*/
</script>
</html>

解析xml的练习

package com.web.parsexml.dom;

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 com.web.parsexml.dom.utils.JaxpDomUtils;

public class JaxpDomTest 
{
	public static void main(String[] args) throws Exception 
	{
		run3();
	}
	//获取author的文本内容
	public static void run() throws Exception
	{
		//获取解析器工厂类
		DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
		//获取解析器对象
		DocumentBuilder builder=factory.newDocumentBuilder();
		//解析xml文档,返回document对象
		Document document=builder.parse("src/book.xml");
		//获取作者元素对象的集合,返回NodeList
		NodeList nodeList=document.getElementsByTagName("author");
		//循环遍历,拿到每一个作者,打印文本内容 getTextContent()
		for(int i=0;i<nodeList.getLength();i++)
		{
			Node node=nodeList.item(i);
			System.out.println(node.getTextContent());
		}
	}

	//在第二本书的末尾添加一个子节点
	public static void run2() throws Exception
	{
		//获取解析器工厂类
		DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
		//获取解析器对象
		DocumentBuilder builder=factory.newDocumentBuilder();
		//解析xml文档,返回document对象
		Document document=builder.parse("src/book.xml");
		//获取第二本书
		Node book2=document.getElementsByTagName("book").item(1);
		//创建元素
		Element cat=document.createElement("猫");
		//设置文本内容
		cat.setTextContent("我是猫");
		//把元素对象添加到第二本书下
		book2.appendChild(cat);
		//回写:transform类,回写类,必须进行回写,不然,添加的内容不会出现在xml文档中
		//创建工厂类
		TransformerFactory transFactory=TransformerFactory.newInstance();
		//获取回写类
		Transformer transformer=transFactory.newTransformer();
		//调用回写方法
		transformer.transform(new DOMSource(document), new StreamResult("src/book.xml"));
	}
	
	//删除节点
	public static void run3() throws Exception
	{
		//获取文档对象
		Document document=JaxpDomUtils.getDocuent("src/book.xml");
		//获取猫
		Node cat=document.getElementsByTagName("猫").item(0);
		//获取书
		Node book2=cat.getParentNode();
		//通过书删除猫
		book2.removeChild(cat);
		//回写
		JaxpDomUtils.writeXML(document, "src/book.xml");
	}
}
写删除的时候对解析并获取文档对象以及回写进行了简单的封装

package com.web.parsexml.dom.utils;

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.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.xml.sax.SAXException;

public class JaxpDomUtils 
{
	public static Document getDocuent(String path) throws Exception
	{
		DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
		DocumentBuilder builder=factory.newDocumentBuilder();
		Document document =builder.parse(path);
		return document;
	}

	public static void writeXML(Document document,String path) throws Exception
	{
		//创建工厂类
		TransformerFactory transFactory=TransformerFactory.newInstance();
		//获取回写类
		Transformer transformer=transFactory.newTransformer();
		//调用回写方法
		transformer.transform(new DOMSource(document), new StreamResult(path));
	}
}	
这些方法,其实用起步难,就是太多太杂了,分得不是很清楚,自己写不出来。

有时间多熟悉熟悉吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值