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特殊字符
* < < * > > * & & * " " * ' '
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);
}
}
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|