2024年2月3日发(作者:)
xml的四种解析方法及源代码(SAX、DOM、JDOM、DOM4J)
第一种:SAX解析
SAX处理机制:SAX是一种基于事件驱动的API。利用SAX解析XML文档,牵涉到两个部分:解析器和事件处理器。解析器负责读取XML文档,并向事件处理器发生事件,如元素开始和元素结束事件;而事件处理器则负责对事件做出响应,对传递的XML数据进行处理。
测试用的xml文件:
Xml代码
<?xml version="1.0" encoding="UTF-8"?>
DTD文件
Xml代码
SAX解析实例一
tHandler类: 可以扩展该类,给出自己的解析实现
Java代码
import ;
import ser;
import serFactory;
import utes;
import eption;
import tHandler;
public class SAXPrinter extends DefaultHandler
{
/** *//**
* 文档开始事件
*/
public void startDocument() throws SAXException
{
n("<?xml version="1.0" encoding="utf-8"?>");
}
/** *//**
* 接收处理指令事件
*/
public void processingInstruction(String target, String data)
throws SAXException
{
n("<?"+target+" "+data+"?>");
}
/** *//**
* 元素开始事件
* 参数说明:
* uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
* localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
* qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
* attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。
*/
public void startElement(String uri, String localName, String
qName, Attributes attrs) throws SAXException
{
("<"+qName);//输出元素名称
int len=gth();//元素属性列表长度
//利用循环输出属性列表
for(int i=0;i { (" "); (me(i)); ("=""); (ue(i)); ("""); } (">"); } /** *//** * 元素中字符数据事件:接收元素中字符数据 * 注意:1.应用程序不要试图读取ch数组指定范围外的数据,(即start至length之外) * 2.有些解析器将使用ignorableWhitespace()方法来报告元素内容中的空白,而不是characters()方法,如:进行有效性验证的解析器 */ public void characters(char[] ch, int start, int length) throws SAXException { (new String(ch,start,length)); } /** *//** * 结束元素事件 */ public void endElement(String uri, String localName, String qName) throws SAXException { (""+qName+">"); } public static void main(String[] args) { SAXParserFactory spf=tance(); try { SAXParser sp=Parser(); (new File(""),new SAXPrinter()); } catch (Exception e) { tackTrace(); } } } SAX解析实例二 tHandler接口: 通过实现该接口给出自己的解析实现。 andler接口:如果SAX应用程序需要实现定制的错误处理,那么它必须实现这个接口,并调用XMLReader对象的setErrorHandler()方法向解析器注册异常处理实例,这样,解析器将通过这个接口报告所有的错误和警告。 Java代码 import utes; import tHandler; import r; import eption; public class ContentHandlerImpl implements ContentHandler { /** *//** * 文档开始事件 */ public void startDocument() throws SAXException { n("<?xml version="1.0" encoding="utf-8"?>"); } /** *//** * 接收处理指令事件 */ public void processingInstruction(String target, String data) throws SAXException { n("<?"+target+" "+data+"?>"); } /** *//** * 元素开始事件 * 参数说明: * uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。 * localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。 * qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。 * attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。 */ public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException { ("<"+qName);//输出元素名称 int len=gth();//元素属性列表长度 //利用循环输出属性列表 for(int i=0;i { (" "); (me(i)); ("=""); (ue(i)); ("""); } (">"); } /** *//** * 元素中字符数据事件:接收元素中字符数据 * 注意:1.应用程序不要试图读取ch数组指定范围外的数据,(即start至length之外) * 2.有些解析器将使用ignorableWhitespace()方法来报告元素内容中的空白,而不是characters()方法,如:进行有效性验证的解析器 */ public void characters(char[] ch, int start, int length) throws SAXException { (new String(ch,start,length)); } /** *//** * 结束元素事件 */ public void endElement(String uri, String localName, String qName) throws SAXException { (""+qName+">"); } public void endDocument() throws SAXException { } public void endPrefixMapping(String prefix) throws SAXException { } public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { } public void setDocumentLocator(Locator locator) { } public void skippedEntity(String name) throws SAXException { } public void startPrefixMapping(String prefix, String uri) throws SAXException { } } Java代码 public class ErrorHandlerImpl implements ErrorHandler { public void warning(SAXParseException e) throws SAXException { n("[Warning ]"+getLocationString(e)+":"+sage()); } public void error(SAXParseException e) throws SAXException { n("[Error ]"+getLocationString(e)+":"+sage()); } public void fatalError(SAXParseException e) throws SAXException { n("[Fatal Error ]"+getLocationString(e)+":"+sage()); } private String getLocationString(SAXParseException e) { StringBuffer sb=new StringBuffer(); String publicId=licId(); if(publicId!=null) { (publicId); (" "); } String systemId=temId(); if(systemId!=null) { (systemId); (" "); } (eNumber()); (":"); (umnNumber()); return ng(); } 1. } Java代码 import putStream; import ource; import der; import derFactory; public class SaxParserTest { public static void main(String[] args) { try { XMLReader xmlReader=XMLReader(); //关闭或打开验证 ture("/sax/features/validation",true); //注册事件处理器 tentHandler(new ContentHandlerImpl()); //注册异常处理器 orHandler(new ErrorHandlerImpl()); (new InputSource(new FileInputStream(""))); } catch (Exception e) { n(sage()); } } } 第二种:DOM解析 DOM中的核心概念就是节点。DOM在分析XML文档时,将将组成XML文档的各个部分(元素、属性、文本、注释、处理指令等)映射为一个对象(节点)。在内存中,这些节点形成一课文档树。整棵树是一个节点,树中的每一个节点也是一棵树(子树),可以说,DOM就是对这棵树的一个对象描述,我们通过访问树中的节点来存取XML文档的内容。 PS:属性节点是附属于元素的,不能被看做是元素的子节点,更不能作为一个单独的节点 Java代码 import nt; import odeMap; import ; import ser; public class DOMPrinter { public static void main(String[] args) { try { /** *//** 获取Document对象 */ DOMParser parser = new DOMParser(); (""); Document document = ument(); printNode(document); } catch (Exception e) { tackTrace(); } } public static void printNode(Node node) { short nodeType=eType(); switch(nodeType) { case SING_INSTRUCTION_NODE://预处理指令类型 printNodeInfo(node); break; case T_NODE://元素节点类型 printNodeInfo(node); printAttribute(node); break; case _NODE://文本节点类型 printNodeInfo(node); break; default: break; } Node child=stChild(); while(child!=null) { printNode(child); child=tSibling(); } } /** *//** * 根据节点类型打印节点 * @param node */ public static void printNodeInfo(Node node) { if (eType() == T_NODE) { n("NodeName: " + eName()); } else if (eType() == _NODE) { String value = eValue().trim(); if (!("")) n("NodeValue: " + value); else n(); }else { n(eName()+" : "+eValue()); } } /** *//** * 打印节点属性 * @param aNode 节点 */ public static void printAttribute(Node aNode) { NamedNodeMap attrs = ributes(); if(attrs!=null) { for (int i = 0; i < gth(); i++) { Node attNode = (i); n("Attribute: " + eName() + "="" + eValue()+"""); } } } DOM生成XML文档: Java代码 import tFoundException; import tputStream; import ption; import ntBuilder; import ntBuilderFactory; import ConfigurationException; import nt; import t; import ializer; public class DOMCreateExample { public static void main(String[] args) throws ParserConfigurationException { //DOMImplementation domImp = Implementation(); DocumentBuilderFactory builderFact = tance(); DocumentBuilder builder = umentBuilder(); Document doc = ument(); //Document doc = Document(null, null, null); Element root = Element("games"); Element child1 = Element("game"); Child(TextNode("Final Fantasy VII")); ribute("genre", "rpg"); Child(child1); Child(root); XMLSerializer serial; try { serial = new XMLSerializer(new FileOutputStream(""), null); ize(doc); } catch (FileNotFoundException e1) { tackTrace(); } catch (IOException e) { tackTrace(); } } } 第三种JDOM解析 JDOM利用了java语言的优秀特性,极大地简化了对XML文档的处理,相比DOM简单易用。JDOM也使用对象树来表示XML文档,JDOM使用SAXj解析器来分析XML文档,构建JDOM树。然而JOMD本身并没有提供解析器,它使用其他开发商提供的标准SAX解析器,JDOM默认通过JAXP来选择解析器,可以通过手动知道解析器的类名来设置。 首先要在工程中添加jdom的jar包,这里使用。(见附件) Java代码 import ; import nt; import t; import lder; import ; import putter; public class JDOMConvert { public static void main(String[] args) { SAXBuilder saxBuilder=new SAXBuilder(); try { Document doc=(new File("")); //首先创建好节点 Element eltDb=new Element("db"); Element eltDriver=new Element("driver"); Element eltUrl=new Element("url"); Element eltUser=new Element("user"); Element eltPassword=new Element("password"); //设置节点的值 t(""); t("jdbc:mysql://localhost/mySql"); t("root"); t("xlc"); //添加到根节点 tent(eltDriver); tent(eltUrl); tent(eltUser); tent(eltPassword); //根节点设置属性 ribute("type","mysql"); Element root=tElement(); //Child("db");//删除节点 tent(eltDb);//增加节点 //修改db节点中内容 ld("db").getChild("user").setText("system"); ld("db").getChild("password").setText("manager"); XMLOutputter xmlOut=new XMLOutputter(); //设置XML格式 Format fmt=ttyFormat(); ent(" "); oding("utf-8"); mat(fmt); (doc,); } catch (Exception e) { tackTrace(); } } } JDOM生成XML文档: Java代码 import ption; import nt; import t; import putter; public class JDOMCreate { public static void main(String[] args) { Document doc = new Document(new Element("games")); Element newGame = new Element("game").setText("Final Fantasy VI"); tElement().addContent(newGame); ribute("genre", "rpg"); XMLOutputter domstream = new XMLOutputter(); try { (doc, ); } catch (IOException e) { tackTrace(); } } } 第四种:DOM4J解析 dom4j与JDOM一样,也是一种用于解析XML文档的开放源代码的XML框架,dom4j也应用于java平台,dom4j API使用了java集合框架并完全支持DOM、SAX和JAXP。与JDOM不同的是,dom4j使用接口和抽象类,虽然dom4j的API相对复杂些,但它提供了比JDOM更好的灵活性。dom4j也使用SAX解析器来分析XML文档,创建dom4j树。此外dom4j也可以接收DOM格式的内容,并提供了从dom4j树到SAX事件流或W3C DOM树的输出机制。与JDOM不同,dom4j自带了一个SAX解析器Aelfred2,如果没有显示的设置SAX解析器,也没有通过系统属性设置解析器,dom3j将会使用JAXP来加载JAXP配置的解析器,如果创建解析器失败,那么最后才使用dom4j自带的Aelfred2解析器。 同样,首先要在工程中添加dom4j的jar包,这里使用。(见附件) Dom4j生成XML文档: Java代码 import ption; import nt; import ntHelper; import t; import Format; import ter; public class Dom4jCreate { public static void main(String[] args) { Document doc = Document(); cessingInstruction("xml-stylesheet", "type='text/xsl' href=''"); Type("dbconfig", null,""); //Element root=Element("dbconfig"); // tElement(root); Element root = ment("dbconfig"); Element eltDb= ment("db"); Element eltDriver = ment("driver"); Element eltUrl = ment("url"); Element eltUser = ment("user"); Element eltPassword = ment("password"); t(""); t("jdbc:mysql://localhost/mySql"); t("root"); t("xlc"); ribute("type","mysql"); try { //设置输出格式 OutputFormat outFmt = new OutputFormat(" ", true); oding("UTF-8"); /**//*PrintWriter pw = new PrintWriter(); (pw); (); ();*/ XMLWriter xmlWriter = new XMLWriter(, outFmt); // XMLWriter xmlWriter=new XMLWriter(new FileWriter(""),outFmt); (doc); (); (); } catch (IOException e) { tackTrace(); } } } Dom4j修改XML文档: Java代码 import ; import iter; import or; import ; import nt; import t; import Format; import der; import ter; public class Dom4jModify { public Document modifyDocument(File inputXml) { try { SAXReader saxReader = new SAXReader(); Document document = (inputXml); Type("dbconfig",null,""); List list = t(); // Iterator iter = erator(); Iterator iter = or(); Element element = (Element) (); t("db").attribute("type").setValue("mysql"); t("db").element("url").setText("jdbc:mysql://localhost/mySql"); t("db").element("driver").setText(""); t("db").element("user").setText("root"); t("db").element("password").setText("xlc"); // 设置输出格式 OutputFormat outFmt = new OutputFormat(" ", true); oding("UTF-8"); XMLWriter xmlWriter=new XMLWriter(new FileWriter(""),outFmt); (document); (); (); return document; } catch (Exception e) { n(sage()); return null; } } public static void main(String[] args) throws Exception { Dom4jModify dom4jParser = new Dom4jModify(); Document document = Document(new File("")); OutputFormat outFmt = new OutputFormat(" ", true); oding("UTF-8"); XMLWriter xmlWriter = new XMLWriter(,outFmt); (document); (); (); } }
本文发布于:2024-02-03 11:51:55,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170693231550286.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |