<!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));
}
}
这些方法,其实用起步难,就是太多太杂了,分得不是很清楚,自己写不出来。
有时间多熟悉熟悉吧。