Java中的引擎是什么?
引擎就是封装了代码/函数库,通过调用代码/函数库的接口来实现特定的功能,引擎可以理解为一个解析器。
SYSTEM:本地引入dtd文件
编写本地dtd;
xmlns.context:context是上下文,这个文件可以理解为环境;
xmlns.xsi:一般不使用;
导入xml,dtd;
解析xml:DOM4j,dom,sax;
xml过大时会消耗较大的堆内存,所以让xml解析小文件;
dom和sax都不借助别的jar包,jdk自带API可以完成。
文本结点没有属性,返回为null,直接遍历map会产生空指针异常。
DefaultHandler:默认处理器
默认实现解析的接口,(no op)类中没有任何操作的方法;接口的实现类–>定义一个中间类,间接实现实体解析的接口–>让子类有选择的实现接口里面的抽象方法。
sax便于打印所有元素
dom便于获取所有元素的属性值
XML是可扩展标记语言。
可扩展是指用户可以自定义标签。
XML和HTML的区别:XML主要是用来描述数据的,HTML主要是用来展现数据的。
元素:指的是XML中的标记,也可以叫做标签、节点。
元素可以包含字母、数字以及一些其它的可见字符,但必须遵守一些规范:
<1>不能以数字或部分标点符号开头;
<2>不能包含空格和特定的几个符号;
<3>标签可写可不写,标签必须成对出现,不允许缺省结束标签;
<4>根元素有且只有一个(…)是所有其他元素的父元素;
<5>大小写敏感;
<6>允许多层嵌套但是不允许交叉嵌套。
XML属性(Attribute)提供了元素相关的一些额外信息。属性值必须加上引号(可以是双引号,也可以是单引号)。
/*XML实体:&实体名;*/
< <(小于)
> >(大于)
& &(与)
' '(单引号)
" "(双引号)
/*自定义实体*/
<!DOCTYPE 根元素名称[
<!ENTITY 实体名 实体内容>
]>
自定义实体的过程:
先写一对尖括号<>,然后感叹号!,然后DOCTYPE,空格 ,然后根元素;
然后先写一对中括号[],换行;
然后先写一对尖括号<>,感叹号!,ENTITY,再写实体名,实体内容。
记住括号要先写一整对,再写里面的内容。
自定义实体后,引用时通过&xxx;,一定要写分号。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root[
<!ENTITY company "杰普">
]>
<root>
<name>&company;</name>
</root>
浏览器展示时,直接显示杰普。
XML解析器会解析XML文档中所有的文本。
解析器进行解析的内容,称为PCDATA(Parsed CDATA)。解析器不会解析的内容,称为CDATA(Character Data)。
<![CDATA[需要原样输出的字符串]]>
一个XML文件,如果里面的内容,满足XML的基本语法要求,那么这个XML文件就可以说是良构的。在XML文件是良构的基础上,如果这个XML文件还通过dtd文件或者Schema文件的约束验证,那么这个XML文件就可以说是有效的。
良构的XML文件不一定是有效的;有效的XML文件一定是良构的。
描述元素的语法格式:<!ELEMENT 元素名 (内容模式)>
元素的修饰符:() | + * ? ,
() 用来给元素分用组
| 在列出的元素中选择一个
+ 表示该元素最少出现一次,可以出现多次 (1或n次)
* 表示该元素允许出现零次到任意多次(0到n次)
? 表示该元素可以出现,但只能出现一次 (0到1次)
, 对象必须按指定的顺序出现
1.如果是本地DTD的引入:
/*student.dtd*/
<!ELEMENT students (stu)>
<!ELEMENT stu (id,name,age)>
<!ELEMENT id (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
/*students.xml*/
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE students SYSTEM "dtd/students.dtd">
<students>
<stu>
<id>1</id>
<name>tom</name>
<age>20</age>
</stu>
<test></test>
</students>
2.如果是公共DTD的引入
引入hibernate框架的XML配置文件和DTD文件:
hibernate.cfg.xml
hibernate-configuration-3.0.dtd
XML文件中的头部声明:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
第一个双引号中的内容是eclipse查找对应DTD所在的位置;如果有DTD文件,就读取并验证,同时会根据DTD中的内容给出自动提示的信息(Alt+/是自动补全);如果没有DTD文件,就会根据第二个双引号中的内容(URL地址),去网络中下载并读取、验证。
手动下载hibernate-configuration-3.0.dtd的地址:
http://hibernate.sourceforge.net/dtd/hibernate-configuration-3.0.dtd
在网络出现问题或者URL地址本身问题时,需要手动配置eclipse:
Windows-->Preferences-->xml-->XML Catalog-->User Specified Entries-->Add:
key:-//Hibernate/Hibernate Configuration DTD 3.0//EN
value:xml_demo\xml_day02\dtd\hibernate-configuration-3.0.dtd(File System...-->dtd文件的路径)
配置完成后,在xml文件中,输入<hi,然后alt+/,会自动提示<hibernate-configuration>
,并且这个根元素不会继续报错。
Schema文件也可以用来对XML文件内容进行约束、验证,eclipse也可以根据Schema验证进行自动提示。
Schema和DTD的区别:
DTD文件中是DTD的专用语法,Schema文件中就是正常的XML语法,所以Schema文件其实也是个XML文件。
DTD文件的后缀是.dtd,Schema文件的后缀是.xsd,xsd的意思为XML Schema Definition。
DTD文件中的约束条件相对简单,Schema文件中的约束条件更加详细、复杂。
Schema的出现是为了替代DTD文件,但是平时的使用中,俩者都会见到。
XML解析的方式有两种:DOM解析,SAX解析。
DOM,(Document Object Model)文档对象模型,是W3C组织推荐的处理 XML 的一种方式。
使用DOM方式解析,要求解析器把整个XML文档装载到一个Document对象中。Document对象包含文档元素(根元素),根元素包含N个子元素。
XML文档中的每个元素都是一个节点(Node):
XML文档只有一个根节点
XML中每个元素都是一个元素节点
XML中每个文本都是一个文本节点
XML中每个属性都是一个属性节点
XML中每个注释都是一个注释节点
DOM把XML文档解析为一种树结构,这种树结构被称为节点树,通过这棵树可以访问任何一个节点,以及对节点增删改。节点树中的每一个节点之间都有层级关系。
使用DOM解析方式,XML文档的结构关系,在内存的对象中依然存在。
SAX,(Simple API for XML)它不是W3C标准,但它是 XML 社区事实上的标准,因为使用率也比较高,几乎所有的 XML 解析器都支持它。
SAX解析方式的优点:
使用SAX解析方式,不会占用大量内存来保存XML文档数据和关系,效率高。
但是在解析过程中,不会保存节点信息和关系,并且只能从前往后,顺序读取、解析。
SAX解析允许在读取文档的时候,立即对文档进行处理,而不必等到整个文档加载完才对文档进行操作。
1.JAXP中的SAX解析的步骤:
//获取SAXParserFactory工厂类对象
SAXParserFactory.newInstance();
//使用工厂对象,创建出SAX解析器
saxParserFactory.newSAXParser();
//调用解析器的 parse() 解析xml文件,然后重写DefaultHandler类中的方法,进行事件处理
saxParser.parse(filePath, new DefaultHandler(){...};
2.JAXP中的DOM解析步骤:
//获取创建DOM解析器的工厂
DocumentBuilderFactory.newInstance();
//获取工厂对象获取DOM解析器对象
newDocumentBuilder();
//调用DOM解析器对象的方法解析XML文档:parse()方法会返回解析得到的Document对象
parse();
//然后根据文档的结构关系和特点,调用相应的API,对其进行解析。
1.DOM解析:
//创建Document对象
//创建工厂对象
DocumentBuilderFactory.newInstance();
//获取DOM解析器对象
newDocumentBuilder();
//解析XML文档:调用解析器的parse()方法,返回Document对象
//获取元素和元素的属性:
//获取根元素
getDocumentElement();
//获取子节点集合
NodeList childNodes = root.getChildNodes();
//获取每个子节点
//for循环+item方法,遍历节点集合获取子节点
for(int i=0;i<childNodes.getLength();i++) {
Node node = childNodes.item(i);
}
//获取节点的类型
node.getNodeType();
//获取文本节点的内容
node.getTextContent();
//获取元素节点的属性
NamedNodeMap attributes = node.getAttributes();
//获取到属性名和属性值System.out.println(attr.getName()+"="+attr.getValue());
DOM解析一般用在获取每个元素的属性。
2.SAX解析:
//创建工厂类对象:SAXParserFactory.newInstance()
//创建出SAX解析器对象:saxParserFactory.newSAXParser()
//解析XML文档:调用解析器的parse()方法
saxParser.parse(filePath, new DefaultHandler(){...}
//重写DefaultHandler类中的方法,进行事件处理(5个方法)
startDocument();
//解析器发现文档的开始标签,会自动调用该方法
endDocument();
//解析器发现文档结束标签,会自动调用该方法
startElement();
//解析器发现一个起始标签 ,会自动调用该方法
characters();
//解析器发现标签里面的文本值,会自动调用该方法
endElement();
//解析器发现一个结束标签,会自动调用该方法
SAX解析适合于打印出所有元素及其信息。
3.dom4j解析:
//获取 org.dom4j.Document文档对象:
public Document parse(File file) throws DocumentException{
SAXReader reader = new SAXReader();
Document document = reader.read(file);
return document;
}
//获取元素的所有属性、所有子节点或指定名字的子节点:Iterator遍历获取元素内容。