xml基础和jaxp操作笔记

一.表单提交方式
* 使用button提交代码
//实现提交方法
function form1(){
//获取form
var form2 = document.getElementById("form1");
//设置action
form2.action="hello.html";
//提交form表单
form2.submit();
}
* 使用超链接
<a herf="hello.html?username=123456">使用超链接提交</a>
* onclick 鼠标点击事件
* onchange 改变内容 和select一起使用
* onfocus 得到焦点
* onblur 失去焦点
<input type="text" id="id1" value="please enter" name="text1" onfocus="focus1();" onblur="blur1();"/>
function focus1(){
var input1 = document.getElementById("id1");
input1.value="";
}
function blur1(){
var input1 = document.getElementById("id1");
input1.value="please enter";
}


二.xml的简介
* eXtensible Markup Language:可扩展标记语言
- 使用标签来操作
- 可扩展
- HTML里面的标签固定,每一个标签都有一个特定的含义
- 标签自己定义,可以写中文的标签

* 用途
** HTML是用于显示数据,xml也可以显示数据
** xml的主要功能适用于存储数据
三.xml的应用
* 不同的系统之间传输数据
* 用来表示生活中有关系的数据
* 经常配置文件

四.xml的语法
1.xml的文档声明
* 创建一个文件 后缀名师 .xml
* 如果写xml,必须写文档声明
- <?xml version="1.0" encode="gbk"?>
** 必须写第一行的第一列
- 属性
- version:版本 使用1.0
- encoding: utf-8 gbk ios8859-1(不包含中文)
- standalone:是否依赖其他文件 yes/no
- xml乱码解决
设置的编码和保存的编码要一致

2.定义元素(标签)
3.定义属性
4.注释
5.特殊字符
6.CDATA
7.PI指令
五.xml与元素的定义
* 标签的定义有开始必须要有结束
* 标签没有内容可以在标签内结束:<aa/>
* 标签可以嵌套,但是必须合理嵌套
** 合理 <a><b></b></a>
** 不合理 <a><b></a></b>
* 一个xml中,只能有一个根标签,其他的标签只能是他的子标签
* 在xml中,它会把我们的空行和空格都解析
** 下面的代码含义是不一样的
- <a>1111</a>
- <b>
1111
  </b>
* 命名的规则
1.区分大小写
2.标签不能使用数字和下划线(_)开头
3.不能使用xml、 XML 、Xml 等开头
4.xml标签不能包含空格和冒号
<a a><a:a>:这些都是不正确的
* xml的标签可以是中文
六.xml的属性定义
* <person id1="aaa"></person>
* 属性定义要求
1.一个标签可以有多个属性
2.属性名称不能相同
3.属性值必须用单引号和双引号包裹起来,属性名称和属性值之间使用 = 
4.xml属性的名称规范和元素的名称规范一致
七.xml的注释
* 写法<!-- xml的注释-->
* 注意:
注释不能嵌套
* 注释不能放在第一行
八.xml中的特殊字符
< &lt;
> &gt;
""  &quot;
''  &apos;
& &amp;
九.CDATA区(了解)
* 可以解决多个需要转义的操作if(a>b && b<c)
* 把这些内容放在CDATA区
** 写法 
<![CDATA[ 内容 ]]>
<![CDATA[<b>if(a>b && b<c</b>]]>
十.PI指令(处理指令)
* 可以再xml中设置样式
* 写法 <?xml-stylesheet type="text/css" herf="名称.css"?>
-注意:它只能在英文标签起作用,对于中文名称不起作用
十一.xml的约束
* 为什么使用约束?
** 比如有一个person的xml文件,但是只想保存人的信息,其他信息过滤不显示,需要约束

* xml约束:dtd约束和schema约束
十二.dtd的快速入门
* 创建一个文件 文件名.dtd
步骤:
- 看xml中有多少个元素,有几个元素,就在dtd中写几个元素<!ELEMENT>
- 判断元素是复杂元素还是简单元素
复杂元素:有子元素
<!ELEMENT 元素名称 (子元素)>

简单元素
<!ELEMENT 子元素名称(#PCDATA)>
- 需要引入dtd文件
<!DOCTYPE 父元素 SYSTEM "文件名.dtd">

** 案例:
文件清单:book.xml
<?xml version="1.0" ?>
<!DOCTYPE 书架 SYSTEM "book.dtd">
<书架>
<书>
<书名>葵花宝典</书名>
<作者>东方不败</作者>
<售价>100元</售价>
</书>
<书>
<书名>九阳神功</书名>
<作者>东方不败</作者>
<售价>100元</售价>
</书>
</书架>
文件清单:book.dtd
<!ELEMENT 书架(书)>
<!ELEMENT 书(书名,作者,售价)>
<!ELEMENT 书名(#PCDATA)>
<!ELEMENT 作者(#PCDATA)>
<!ELEMENT 售价(#PCDATA)>
** 打开xml文件使用浏览器打开,浏览器只是负责校验xml语法,不负责校验约束,使用工具校验myeclipse
十三.dtd的三种引入方式
1.引入外部文件
<!DOCTYPE 根元素名称 SYSTEM "根文件.dtd">
2.引入内部文件
<!DOCTYPE 根元素名称[
<!ELEMENT 书架(书)>
<!ELEMENT 书(书名,作者,售价)>
<!ELEMENT 书名(#PCDATA)>
<!ELEMENT 作者(#PCDATA)>
<!ELEMENT 售价(#PCDATA)>
]>
3.使用外部的dtd文件(网络上的dtd文件)
<!DOCTYPE 根元素名称 PUBLIC "DTD名称" "DTD文档的URL">


十四.使用dtd定义元素
* 语法 <!ELEMENT 元素名 约束>
*  简单元素的三种类型:
***(#PCDATA) :约束name是字符串类型
***EMPTY:元素为空
***ANY:任意类型
* 复杂元素:
***<!ELEMENT 元素名称(子元素)>:子元素只能出现一次
*** 表示子元素出现的次数

+:表示一次或者多次 <!ELEMENT person(name+,sex)>
?:表示出现0次或者一次 <!ELEMENT person(name?,sex)>
*:表示0次或者多次 <!ELEMENT person(name*,sex)>
*** 子元素是用逗号隔开
— 逗号表示子元素出现的顺序
*** 子元素用|隔开,表示只能出现子元素的任意一个
十五.dtd定义属性
* 语法
<!ATTLIST 属性名 属性类型 属性约束>
- 属性类型
** CDATA:字符串
--<!ATTLIST birthday
ID1 CDATA #REQURED
>
** 枚举:只能在一定范围内出现值,但是只能出现一次
--(aa|bb|cc)
-- 红绿灯的效果
-- <!ATTLIST age
ID2 (AA|BB|CC) #REQURED
   >
** ID:值只能是字母和下划线开头
--<!ATTLIST age
ID3 ID #REQURED
>
- 属性的约束
** #REQURED:属性必须存在
** #IMPLIED:属性可有可无
** #FOXED:表示一个固定值 
-- #FOXED "AAA"
--<!ATTLIST sex
ID4 CDATA #FOXED "AAA"
>
** 直接值 不写属性就是直接值,写了就是当前的属性值
-- <!ATTLIST sex
ID4 CDATA  "AAA"
>
--<!ATTLIST 页面作者
姓名 CDATA #IMPLED
年龄 CDATA #IMPLED
联系方式 CDATA #REQURED
网站职务 CDATA #FIXED "页面作者"
个人爱好 CDATA "上网"
>
十六.实体的定义
* 语法 <!ENTITY 实体名称 "实体值">
*** <!ENTITY TEST "HAHA">
*** 使用实体 &实体名称; 比如&TEST;
** 注意:定义实体必须写在dtd里面
十七.xml的解析和简介(写到java代码)(****重点)
* xml的解析方式(技术):dom和sax

dom方式解析优点:容易进行增删改查
缺点:容易内存溢出
sax解析采用事件驱动,边读边解析
- 从上到下,一行一行的解析,解析到某一个对象,把对象返回
- 优点:实现查询,不会造成内存溢出
- 缺点:不能实现增删改查

** 不同的公司提供了 针对dom和sax方式的解析器,通过api方式提供
-- sun公司      jaxp
-- dom4j组织    dom4j(***实际开发中)
-- jdom 组织    jdom
十八.jaxp的api查看
** jaxp是javase的一部分
** jaxp解析器在jdk中的javax.xml.parsers包里面
-- dom:
-- DocumentBulider:解析器类
- 这是一个抽象类
- 方法:DocumentBuliderFactory.newDocumentBulider();
- 一个方法,可以解析xml parse("xml路径") 返回的是方法:Document整个文档
- 返回的document是一个接口,父节点是Node,如果在document找不到相应的方法,在Node里面去找
- document里面的方法
getElementsByTagName(String tagname)
- 这个方法可以得到标签,返回的是一个集合 NodeList
createElement(String tagname)
-创建标签
createTextNode(String data)
-创建文本
appendChild(Node newChild)
- 把文本添加到标签下面
removeChild(Node oldChild)
- 删除节点
getParentNode()
- 获取父节点
NodeList
- getLength() 得到集合的长度
- item(int index) 下标获取具体的长度
for(int i=0;i<list.getLength();i++){
list.item(i);
}
getTextContent();
-得到元素里面的值
-- DocumentBuliderFactory :解析器工厂类
- 这是一个抽象类

--sax:
--SAXParsers:解析器类
--SAXParsersFactory:解析器工厂类
十九.使用jaxp操作节点
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<person>
<p1>
<name>jack</name>
<age>22</age>
<nv>女</nv></p1>
</person>
* 使用jaxp查询节点
* 查询xml中所有的name和age元素的值
//创建解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
//创建解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
//解析xml返回document
Document document = builder.parse("src/NewFile1.xml");
//获取xml中的每一个对象
NodeList list = document.getElementsByTagName("age");
//遍历集合
for(int i=0; i<list.getLength();i++){
Node node = list.item(i);
String s = node.getTextContent();
System.out.println(s);
}

* 查询xml中的第一个name值
1、创建解析器工厂
2、根据解析器创建解析器
3、解析xml得到document
4、得到所有的name元素
5、使用返回集合 item,用下标获取第一个元素
6、得到具体的值,使用getTextContent方法

//创建解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
//创建解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
//解析xml返回document
Document document = builder.parse("src/NewFile1.xml");
//得到xml中所有的name元素的值,返回的是一个集合
NodeList list = document.getElementsByTagName("name");
//获取集合中的第一个name元素
Node node = list.item(0);
//获取node的具体值
String s1 = node.getTextContent();
System.out.println(s1);

* 使用jaxp添加节点
* 在p1下面添加一个标签属性<sex>女</sex>

1、创建解析器工厂
2、根据解析器创建解析器
3、解析xml得到document
4、得到第一个p1。使用item下标得到
5、创建sex标签 createElement
6、创建文本 createTextNode
7、把文本添加到sex下面 appendChild
8、把sex添加到第一个p1下面

9、回写xml

// 创建解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory
.newInstance();
// 创建解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
// 解析xml返回document
Document document = builder.parse("src/NewFile1.xml");
// 得到p1标签
NodeList list = document.getElementsByTagName("p1");
// 得到第一个p1下的最后一个元素
Node node = list.item(0);
// 创建nv标签
Element nv1 = document.createElement("sex");
// 创建文本
Text text1 = document.createTextNode("女");
//把文本添加到标签下
nv1.appendChild(text1);
// 把nv添加到node下
node.appendChild(nv1);
// 回写xml
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/NewFile1.xml"));

* 使用jaxp修改节点
* 修改p1下面的sex内容
1、创建解析器工厂
2、根据解析器创建解析器
3、解析xml得到document
4、得到sex item方法
5、修改sex里面的值 setTextContent方法
6、回写xml

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
// 创建解析器
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
// 解析xml返回的是Document对象
Document document = documentBuilder.parse("src/NewFile1.xml");
// 得到sex
Node node = document.getElementsByTagName("sex").item(0);
// 修改
node.setTextContent("男");
// 回写xml
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/NewFile1.xml"));

* 使用jaxp删除节点
* 删除p1下面的sex节点

1、创建解析器工厂
2、根据解析器创建解析器
3、解析xml得到document
4、得到sex元素
5、获取sex的父节点 getParentNode
6、通过父节点删除sex节点 removeChild
7、回写xml

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
// 创建解析器
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
// 解析xml  返回的是document对象
Document document = documentBuilder.parse("src/NewFile1.xml");
// 得到p1节点
Node node = document.getElementsByTagName("p1").item(0);
// 得到p1的父节点
Node node1 = node.getParentNode();
// 删除节点
node1.removeChild(node);
//回写操作
TransformerFactory transformerFactory = TransformerFactory.newInstance();

Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/NewFile1.xml"));

* 使用jaxp遍历节点
* 遍历节点,把所有的元素名称打印出来

1、创建解析器工厂
2、根据解析器创建解析器
3、解析xml得到document
==========使用递归
4、得到根节点
5、得到根节点的子节点
6、得到根节点的子节点的子节点
// 遍历节点

public static void listElement() throws Exception{
// 创建工厂类
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
// 创建解析器
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
// 解析xml 返回 Document
Document document = documentBuilder.parse("src/NewFile1.xml");
list1(document);
}


private static void list1(Node node) {
// TODO Auto-generated method stub
// 判断节点是否为元素
if(node.getNodeType() == Node.ELEMENT_NODE){
System.out.println(node.getNodeName());
}
// 
NodeList list = node.getChildNodes();
// 遍历节点
for(int i=0;i<list.getLength();i++){
// 得到每一个节点
Node node2 = list.item(i);
list1(node2);
}
}

猜你喜欢

转载自blog.csdn.net/qq_34668848/article/details/80950128