SAX
会在解析文档的各个部分时候调用事件回调,DOM是基于此基础上建立DOM树的
ContentHandler接口定义了若干个在解析文档时解析器会调用的回调方法
startElement 和endElement在每当遇到起始会终止标签时调用
characters在每当遇到字符数据时调用
startDocument 和endDocument分别在文档开始和结束时各调用一次
<font>
<name>宋体</name>
<size units="pt">23</size>
</font>
解析器会产生如下回调
startElement 元素名font
startElement 元素名 name
characters 内容 宋体
endElement 元素名 name
startElement 元素名 size 属性 units="pt"
characters 内容 23
endElement 元素名size
endElement 元素名 font
SAXParserFactory factory = SAXParseFactory.newInstance();
SAXParser parser = factory.newSAXPrser();
parser.parse(source,handler);
handler属于DefualtHandler的一个子类,为如下四个接口定义了空的方法
ContentHandler startElement()
DTDHandler
EntityResolver
ErrorHandler
setNamespaceAware(true)//激活命名空间
如果不需要dtd验证
factory.setFeature("http://apache.rog/xml/features/nonvalidating/load-external-dtd",false);
StAX
一种拉解析器
inputStream in = url.openStream();
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader parser = factory.createXMLStreamReader(in);
while(parser.hasNext()){
int event = parser.next();
Call parser methods to obtain event details
}
<font>
<name>宋体</name>
<size units="pt">23</size>
</font>
解析器将产生如下事件
START_ELEMENT 元素名 font
CHARACTERS 内容 空白字符串
START_ELEMENT 元素名 name
CHARACTERS 内容 宋体
END_ELEMENT 元素名name
CHARACTERS 内容 空白字符串
.....
分析这些属性调用XMLStreamReader类中的恰当方法
String units = parser.getAttributeValue(null,"unit");
默认情况下命名空间是开启的
XMLInputStream factory = XMLInputFactory.newInstance();
factory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE,false);