xml有两种解析方式:dom和sax
在xml中元素分为简单元素和复杂元素,没有子元素的元素称为简单元素,包含子元素的元素称为复杂元素。
dom解析方式类似于JS中的dom树解析,将所有节点整理为树然后从根节点开始解析
优点是可以很方便的实现增删改操作,缺点是内存占用太大,在对于大量数据操作时容易造成内存溢出
sax解析方式是对于xml中的节点从上往下一行一行解析,可以有效避免对于大量数据操作时的内存溢出情况,缺点是无法实现增删改操作
xml约束:
(一)——dtd约束:
dtd约束可以使用单独的dtd文件进行约束,使用自身的dtd语法,可以在嵌套在xml文件内,也可以在xml文件中引用外部的dtd约束
示例:根据dtd约束实现xml文档:
<!DOCTYPE TVSCHEDULE [
<!ELEMENT TVSCHEDULE (CHANNEL+)>
<!ELEMENT CHANNEL (BANNER,DAY+)>
<!ELEMENT BANNER (#PCDATA)>
<!ELEMENT DAY (DATE,(HOLIDAY|PROGRAMSLOT+)+)>
<!ELEMENT HOLIDAY (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT PROGRAMSLOT (TIME,TITLE,DESCRIPTION?)>
<!ELEMENT TIME (#PCDATA)>
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT DESCRIPTION (#PCDATA)>
<!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED>
<!ATTLIST CHANNEL CHAN CDATA #REQUIRED>
<!ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED>
<!ATTLIST TITLE RATING CDATA #IMPLIED>
<!ATTLIST TITLE LANGUAGE CDATA #IMPLIED>
]> -----来源:https://www.w3school.com.cn/dtd/dtd_examples.asp
(二)——schema约束:
schema约束是比dtd约束更复杂的约束方式,语法使用xml语法,文件一般后缀名为.xsd,一般在xml文件的外部引用
schema可以做到:
-
定义可出现在文档中的元素
-
定义可出现在文档中的属性
-
定义哪个元素是子元素
-
定义子元素的次序
-
定义子元素的数目
-
定义元素是否为空,或者是否可包含文本
-
定义元素和属性的数据类型
-
定义元素和属性的默认值以及固定值
示例:根据schema约束完成xml文档:
<?xml version="1.0" encoding="ISO-8859-1"?>
<shiporder orderid="889923"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
<orderperson>George Bush</orderperson>
<shipto>
<name>John Adams</name>
<address>Oxford Street</address>
<city>London</city>
<country>UK</country>
</shipto>
<item>
<title>Empire Burlesque</title>
<note>Special Edition</note>
<quantity>1</quantity>
<price>10.90</price>
</item>
<item>
<title>Hide your heart</title>
<quantity>1</quantity>
<price>9.90</price>
</item>
</shiporder>
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="shiporder">
<xs:complexType>
<xs:sequence>
<xs:element name="orderperson" type="xs:string"/>
<xs:element name="shipto">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="item" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string" minOccurs="0"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="orderid" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
xml解析器:
jaxp:sun公司推出的专门解析xml语言的解析器
dom4j:目前使用最多的xml解析器
示例:使用jaxp方式解析xml文档示例:
使用sax方式进行解析:
package xmlTest;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class TestSax {
public static void main(String[] args) throws Exception{
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
SAXParser saxParser = saxParserFactory.newSAXParser();
saxParser.parse("src/p1.xml", new MyDefault1());
}
}
class MyDefault1 extends DefaultHandler{
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
System.out.print("<"+qName+">");
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
System.out.print(new String(ch, start, length));
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.print("<"+qName+">");
}
}
使用sax解析方式进行解析时需要继承DefaultHandler类,使用parse方法进行文档解析,传入两个参数,第一个是xml路径,第二个是dh事务。
dh事务中包含三个重要方法:startElement解析开始标签,characters解析文档内容,endElement解析结束标签。
由于sax方式解析xml无法实现增删改操作,一般读取标签及标签内容即可。