xml学习——xml解析方式

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无法实现增删改操作,一般读取标签及标签内容即可。

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值