天天看点

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" οnfοcus="focus1();" οnblur="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);

}

}