1。xml背景
æ ¼å¼è‰¯å¥½çš„(web-fromedåQ‰xmlå¯ä»¥ä¸éœ€è¦æ–‡æ¡£ç±»åž‹å®šä¹‰ï¼ˆDTDåQ‰ï¼Œåªè¦æ»¡èƒö基本的xmlæ ¼å¼è§„范?y¨u)®±å¯ä»¥è®¤ä¸ºæ˜¯æ ¼å¼è‰¯å¥½çš„xmlæ–‡æ¡£ã€‚ä½†æ˜¯æ ¼å¼æ ‡å‡†ï¼Œåªèƒ½è¯´æ˜Žå…ƒç´ ã€æ ‡½{¾ã€æ ¼å¼æ˜¯åˆæ³•的,òq¶ä¸èƒ½è¯´æ˜Žå…ƒç´ 是有æ„义的åQŒæˆ–者说规范的ã€?/p>
有效的xml文档åQŒé¦–å…ˆè¦æ±‚æ˜¯æ ¼å¼è‰¯å¥½çš„æ–‡æ¡£ï¼ŒåŒæ—¶éµå®ˆç›¸åº”çš„DTDæ–‡äšg¾U¦æŸã€?/p>
2。xmlè§£æž
xml文档解æžçš„大致ä‹É用过½E‹å¦‚下图åQ?/p>
ç”±xmlè§£æžå™¨è§£æžå’Œæ“作指定的xml文档åQŒç„¶åŽæä¾›æŽ¥å£ä¾›åº”用½E‹åºä½¿ç”¨ã€‚如果解æžå™¨ä¸åŒåQŒé‚£ä¹ˆæä¾›çš„æŽ¥å£ž®±æœ‰å¯èƒ½ä¸åŒã€‚庆(ji¨£n)òq¸çš„æ˜¯ï¼Œç›®å‰æ‰€æœ‰çš„xmlè§£æžå™¨å¯¹ä¸¤å¥—æ ‡å‡†çš„apiæä¾›äº?ji¨£n)支æŒï¼Œ˜q™ä¸¤å¥—æ ‡å‡†apiž®±æ˜¯domå’Œsaxã€?/p>
domåQšå³document object modelåQŒæ–‡æ¡£å¯¹è±¡æ¨¡åž‹ï¼Œå®ƒæ˜¯w3c¾l„织推è的处ç†xmlçš„æ ‡å‡†æŽ¥å£ã€‚dom是基于xml文档¾l“æž„æ ?w¨¨i)的解æžã€?/p>
saxåQšå³simple api for xmlåQŒå®ƒæ˜¯éžå®˜æ–¹çš„ã€xml½C‘ÖŒºäº‹å®žä¸Šçš„æ ‡å‡†ã€‚sax是基于事件æµçš„è§£æžã€?/p>
domå’Œsaxåªæ˜¯å®šä¹‰äº?ji¨£n)一些接å£ä»¥å?qi¨¢ng)æŸäº›æŽ¥å£çš„¾~ºçœå®žçްåQŒåº”用程åºè¦æƒ›_ˆ©ç”¨dom或sax讉K—®xml文档åQŒè¿˜éœ€è¦çœŸæ£å®žçްdom或sax接å£çš„xmlè§£æžå™¨ã€‚apacheçš„xerces是一个ä‹É用éžå¸¸å¹¿æ³›çš„è§£æžå™¨ï¼Œå®ƒå®žçŽîCº†(ji¨£n)domå’Œsax的调用接å£ï¼Œòq¶æä¾›äº†(ji¨£n)多ç§è¯è¨€çš„实现版本ã€?/p>
3。javaè¯è¨€å¯¹xml文档的解æž?/p>
首先介ç»jaxpåQ?/p>
åŸÞZºŽdom或saxæä¾›çš„api接å£åQŒä‹É用相应的解æžå™¨å®žçŽ°ç±»æˆ‘ä»¬å·²ç»å¯ä»¥å¯¹xml˜q›è¡Œè§£æžå¤„ç†äº?ji¨£n)。如下所½Cºï¼š(x¨¬)
org.xml.sax.XMLReader sp=new org.apache.xerces.parser.SAXParser();
FileInputStream fis=new FileInputStream(“hello.xml”);
InputSource is=new InputSource(fis);
sp.setContentHandler(new MyConentHandler());
sp.parse(is);
ä¸ÞZº†(ji¨£n)å±è”½xmlè§£æžå™¨çš„å˜åŒ–对代ç 的影å“åQŒjavaæä¾›äº?ji¨£n)ä¸€å¥—æ ‡å‡†çš„å¤„ç†xmlæ–‡äšg的接å£ï¼ˆå®žé™…上是一些抽象的工厂¾c»ï¼‰(j¨ª)åQŒä‹Éå¾—javaå¼€å‘äh员ä(sh¨´)»¥ä¸€¿Uæ ‡å‡†çš„æ–¹å¼å¯¹xml˜q›è¡Œ¾~–程åQŒå³jaxpåQˆjava api for xml processingåQ‰ã€‚jaxp没有æä¾›è§£æžxml的新æ–ÒŽ(gu¨©)³•åQŒåªæ˜¯åœ¨è§£æžå™¨ä¹‹ä¸Šå°è£…一个抽象层。在jdk1.6的文档ä¸åQŒæˆ‘们å¯ä»¥çœ‹åˆ°javax.xml,org.w3c.dom,org.xml.sax包åŠ(qi¨¢ng)å…¶å包都属于jaxp的部分。jaxp由接å£ã€æŠ½è±¡ç±»å’Œä¸€äº›è¾…助类¾l„æˆåQŒç¬¦åˆjaxp规范的解æžå™¨å®žçް其ä¸çš„æŽ¥å£å’ŒæŠ½è±¡¾c»ï¼Œå¼€å‘æ—¶åªéœ€è¦ä‹É用jaxpçš„api¾~–程åQŒåº•层的解æžå™¨å¯¹å¼€å‘è€…æ—¶é€æ˜Žçš„,å¯ä»¥éšæ„的切æ¢ã€?/p>
那么jaxp出现åŽï¼Œjava应用½E‹åºå¤„ç†xml文档的过½E‹å°±å¦‚下图:(x¨¬)
那实际采用哪¿Uè§£æžå™¨çš„jaxp实现åQŒå¯ä»¥é€šè¿‡¾pÈ»Ÿå±žæ€§ã€propertiesæ–‡äšg½{‰æ–¹å¼æ¥é…ç½®ã€?/p>
下é¢å…·ä½“介ç»å‡ ç§javaè§£æžxml的方法:(x¨¬)
3.1 DOMæ–¹å¼åQˆjaxpåQ?/p>
在javax.xml.parsers包ä¸åQŒå®šä¹‰äº†(ji¨£n)dom的抽象工厂类DocumentBuilderFactoryåQŒåœ¨˜q™ä¸ª¾cÖM¸æœ‰ä¸€ä¸ªé™(r¨´n)æ€çš„æ–ÒŽ(gu¨©)³•newInstance()åQŒé€šè¿‡å®ƒäñ”生一个DocumentBuilderFactory的实例。å‰é¢æåˆ°è¿‡jaxp¾~–程åQŒè§£æžå™¨æä¾›å•†å¿…™åÈ‘ô承该抽象¾cÖMñ”生一个具体的解æžå™¨å·¥åŽ‚ï¼Œç„¶åŽç”Þp¿™ä¸ªå·¥åŽ‚ç±»å®žä¾‹å‡ÞZ¸€ä¸ªè§£æžå™¨å¯¹è±¡åQŒå†é€šè¿‡è¯¥è§£æžå™¨å¯¹è±¡å¤„ç†xml文档。那么这个newInstanceæ–ÒŽ(gu¨©)³•ž®±æ˜¯ç”¨æ¥äº§ç”Ÿä¸€ä¸ªå…·ä½“的解æžå™¨å·¥åŽ‚ç±»å®žä¾‹åQŒæŸ¥æ‰„¡”Ÿæˆè§£æžå™¨å·¥åŽ‚¾cÕd®žä¾‹çš„æ–¹å¼å¯å‚考jdk文档ã€?/p>
在获å–到解æžå™¨å·¥åŽ‚ç±»å®žä¾‹¾cÖM¹‹åŽï¼Œž®±å¯ä»¥è°ƒç”¨newDocumentBuilder()æ–ÒŽ(gu¨©)³•创å¾ä¸€ä¸ªdomè§£æžå™¨å®žä¾‹ï¼›domè§£æžå™¨å®žä¾‹å°±å¯ä»¥è°ƒç”¨parser()æ–ÒŽ(gu¨©)³•èŽ·å–æ•´ä¸ªxmlé—®ç”çš„Document对象ã€?/p>
3 .2 SAXæ–¹å¼åQˆjaxpåQ?/p>
sax是基于事仉™©±åŠ¨çš„apiåQŒsaxè§£æžxml文档时会(x¨¬)å‘事件处ç†å™¨å‘é€ä¸åŒçš„事äšg。saxè§£æžå™¨æŽ¥å£å’Œäº‹äšg处ç†å™¨æŽ¥å£éƒ½åœ¨org.xml.sax包ä¸å®šä¹‰ã€‚XMLReaderå³äØ“(f¨´)sax定义的解æžå™¨æŽ¥å£åQŒç”±è§£æžå™¨æä¾›å•†å®žçŽ°è¯¥å€Ÿå£åQŒåº”用程åºéœ€è¦åšçš„æ˜¯¾~–写一个事件处ç†å™¨ã€‚å¯ä»¥é€šè¿‡XMLReaderçš„setContentHandler()æ–ÒŽ(gu¨©)³•æ¥è®¾¾|®ä¸€ä¸ªäº‹ä»¶å¤„ç†å™¨çš„实例ã€?/p>
与dom¾cÖM¼¼åQŒjaxpä¹ŸäØ“(f¨´)saxè§£æžå™¨æä¾›äº†(ji¨£n)抽象工厂¾c»SAXParserFactory¾c»ï¼Œsaxè§£æžå™¨å·¥åŽ‚ç±»çš„å®žä¾‹ä¸Ždomè§£æžå™¨å·¥åŽ‚ç±»çš„å®žä¾‹ç±»ä¼û|¼Œéƒ½æ˜¯é€šè¿‡newInstance()æ–ÒŽ(gu¨©)³•æ¥åˆ›å»ºï¼Œä¸åŒçš„æ˜¯SAXParserFactoryçš„newInstance()æ–ÒŽ(gu¨©)³•查找的工厂类属性是åQšjavax.xml.parsers.SAXParserFactoryã€‚åŒæ øP¼ŒèŽ·å–saxè§£æžå™¨å®žä¾‹çš„æ–ÒŽ(gu¨©)³•åQŒå¯ä»¥é€šè¿‡è°ƒç”¨newSAXParser()ã€?/p>
使用SAXParserå’ŒXMLReader都å¯ä»¥ç”¨æ¥å¯¹xml文档˜q›è¡Œè§£æžåQŒå‰è€…åªæ˜¯å¯¹åŽè€…åˆä¸€‹Æ¡çš„包装ã€?/p>
3.3 JDOM
dom被设计用于完æˆå‡ 乎所有的xmlæ“作ä»ÕdŠ¡åQŒåŒæ—¶åˆæ˜¯ä¸Žè¯è¨€æ— 关的,˜q™å°±å¯ÆD‡´domçš„apiåºžå¤§è€Œä¸”å¤æ‚ã€‚äØ“(f¨´)äº?ji¨£n)ä‹Éjava½E‹åºå‘˜æ›´æ–¹ä¾¿åœ°å¤„ç†xml文档åQŒä¸¤ä½å›½å¤–çš„java技术专家创å»ÞZº†(ji¨£n)jdom。用developerworks上的一å¥è¯åQ?#8220;延箋(hu¨¤)å¼€æºç¤¾¾Ÿ¤æœ‰éœ€è¦å°±åˆ›å¾å·¥å…·çš„历å²ä¼ ¾lŸï¼ŒJava 技术专å®?Jason Hunter å’?Brett McLaughlin ¾~”é€ äº†(ji¨£n) JDOM”。所以å¯ä»¥è®¤ä¸ºï¼Œjdom是一¿U专门用于javaè¯è¨€è§£æžxml文档的开放æºä»£ç 框架ã€?/p>
jdom也ä‹Éç”¨å¯¹è±¡æ ‘(w¨¨i)æ¥è¡¨½Cºxml文档åQŒåº•层ä‹É用saxè§£æžå™¨åˆ†æžxml文档åQŒåÅžæˆjdomæ ?w¨¨i)ã€?/p>
3.4 DOM4J
åŒjdomä¸€æ øP¼Œdom4j也是应用于javaòq›_°åQŒæä¾›ç®€å•ã€çµ‹zÈš„处ç†xmlæ–‡æ¡£çš„å¼€å‘æºä»£ç åº“ã€‚å¾ˆæœ‰æ„æ€çš„æ˜¯ï¼Œdom4j是由早期开å‘jdomçš„äh分离出æ¥è€ŒåŽç‹¬ç«‹å¼€å‘çš„åQŒï¼ˆåˆ©ç›Šæˆ–æ„è§ä¸å’Œï¼Ÿå‘µå‘µåQ‰ä¸Žjdom相比åQŒdom4jæä¾›äº?ji¨£n)更好的ç‰|´»æ€§ã€‚从¾|‘上的评论å¯ä»¥çœ‹å‡ºï¼Œdom4j从性能ã€åŠŸèƒ½ã€æ˜“用性上都优?sh¨´)ºŽjdomåQŒå¯ä»¥ä½œä¸ø™§£æžxmlæ–‡äšg的首选。(看æ¥åŽæ¥åˆ†ç¦»å‡ºçš„那拨人选择˜q˜æ˜¯æ£ç¡®çš„ï¼åQ‰æµè¡Œçš„hibernateåQŒjaxm都采用了(ji¨£n)dom4j处ç†xmlæ–‡äšgã€?/p>
dom4j也ä‹É用saxè§£æžå™¨æ¥åˆ†æžxml文档åQŒåÅžæˆdom4jæ ?w¨¨i);它也æä¾›äº†(ji¨£n)ç”¨äºŽå¤§æ–‡æ¡£çš„åŸºäºŽäº‹ä»¶çš„å¤„ç†æ¨¡åž‹ã€?/p>
所以å¯ä»¥çœ‹å‡ºï¼Œjdomå’Œdom4jåªæ˜¯å¼€æºç¤¾åŒÞZñ”生出æ¥çš„æ–¹ä¾¿åœ°è§£æžxml的框架或工具åQŒåÆˆæ²¡æœ‰åˆ›é€ æ–°çš„xmlè§£æžæ–¹å¼ã€‚如果拿
拿以上四¿Uè§£æžxml的方法比较,用å™é‘«è€å¸ˆçš„è¯åQŒå¦‚æžœä½ éœ€è¦é¢‘¾Jæ›´æ¢è§£æžå™¨ž®±æ˜¯jaxpæ–¹å¼åQŒå¦åˆ™æŽ¨èä‹É用dom4jã€?/p>