ml的四种解析方法及源代码

上传人:z**** 文档编号:123214072 上传时间:2022-07-22 格式:DOC 页数:38 大小:99KB
返回 下载 相关 举报
ml的四种解析方法及源代码_第1页
第1页 / 共38页
ml的四种解析方法及源代码_第2页
第2页 / 共38页
ml的四种解析方法及源代码_第3页
第3页 / 共38页
亲,该文档总共38页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
xml的四种解析方法及源代码(SAX、DOM、JDOM、DOM4J) 第一种:SAX解析SAX处理机制:SAX是一种基于事件驱动的API。利用SAX解析XML文档,牵涉 到两个部分:解析器和事件处理器。解析器负责读取XML文档,并向事件处理器 发生事件,如元素开始和元素结束事件;而事件处理器则负责对事件做出响应, 对传递的 XML 数据进行处理。测试用的 xml 文件: db.xmlXml代码黛!-jdbc:oracle:thin:localhost:1521:oraclescotttigerDTD 文件 db.dtdXml代码黛SAX 解析实例一 org.xml.sax.DefalutHandler 类: 可以扩展该类,给出自己的解析实现 SAXPrinter.javaJava代码_import java.io.File;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 SAXPrinter extends DefaultHandler/* */* 文档开始事件*/public void startDocument() throws SAXExceptionSystem.out.println(?xml version=1.0 encoding=utf-8/*/public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException attributes - 附加到元素的属性。如果没有属性,则它将是空 的 Attributes 对象。/* 接收处理指令事件*/public void processingInstruction(String target, String data) throws SAXExceptionSystem.out.println();/* */* 元素开始事件* 参数说明:* uri - 名称空间 URI ,如果元素没有任何名称空间 URI ,或者没有正 在执行名称空间处理,则为空字符串。* localName - 本地名称(不带前缀),如果没有正在执行名称空间处 理,则为空字符串。* qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空 字符串。System.out.print(+qName);/ 输出元素名称int len=attrs.getLength();/ 元素属性列表长度/ 利用循环输出属性列表for(int i=0;i);/*/public void characters(char ch, int start, int length) throw s SAXException 2. 有些解析器将使用 ignorableWhitespace() 方法来报告元素内容中的空白,而不是characters()方法,如:进行有效性验证的解析器/* 元素中字符数据事件:接收元素中字符数据* 注意:1. 应用程序不要试图读取 ch 数组指定范围外的数据,( 即 start 至 length 之外 )System.out.print(new String(ch,start,length);/* */* 结束元素事件*/public void endElement(String uri, String localName, String qN ame) throws SAXExceptionSystem.out.print();public static void main(String args)SAXParserFactory spf=SAXParserFactory.newInstance();trySAXParser sp=spf.newSAXParser();sp.parse(new File(db.xml),new SAXPrinter();catch (Exception e)e.printStackTrace();SAX 解析实例二org.xml.sax.ContentHandler 接口: 通过实现该接口给出自己的解析实现。 org.xml.sax.ErrorHandler 接口:如果 SAX 应用程序需要实现定制的错误处理 那么它必须实现这个接口,并调用XMLReader对象的setErrorHandler ()方法向 解析器注册异常处理实例,这样,解析器将通过这个接口报告所有的错误和警告ContentHandlerImpl.javaJava代码症import org.xml.sax.Attributes;import org.xml.sax.ContentHandler;import org.xml.sax.Locator;import org.xml.sax.SAXException;public class ContentHandlerImpl implements ContentHandler/* */* 文档开始事件*/public void startDocument() throws SAXExceptionSystem.out.println( );* 接收处理指令事件*/public void processingInstruction(String target, String data) th rows SAXExceptionSystem.out.println();/* */* 元素开始事件* 参数说明:* uri - 名称空间 URI ,如果元素没有任何名称空间 URI ,或者没有正 在执行名称空间处理,则为空字符串。* localName - 本地名称(不带前缀),如果没有正在执行名称空间处 理,则为空字符串。* qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空 字符串。* attributes - 附加到元素的属性。如果没有属性,则它将是空 的 Attributes 对象。*/public void startElement(String uri, String localName, String qN ame, Attributes attrs) throws SAXExceptionSystem.out.print(+qName);/ 输出元素名称int len=a tt rs.ge tLeng th();/元素属性列表长度/利用循环输出属性列表for(int i=0;i);/* */* 元素中字符数据事件:接收元素中字符数据* 注意:1. 应用程序不要试图读取 ch 数组指定范围外的数据,( 即 start 至 length 之外 )*2. 有些解析器将使用 ignorableWhitespace() 方法来报告元素内容中的空白,而不是characters()方法,如:进行有效性验证的解析器*/public void characters(char ch, int start, int length) throws SAXExceptionSystem.out.print(new String(ch,start,length);* 结束元素事件*/public void endElement(String uri, String localName, String qNam e) throws SAXExceptionSystem.out.print();public void endDocument() throws SAXExceptionpublic void endPrefixMapping(String prefix) throws SAXExceptionpublic void ignorableWhitespace(char ch, int start, int length ) throws SAXExceptionpublic void setDocumentLocator(Locator locator)public void skippedEntity(String name) throws SAXExceptionpublic void startPrefixMapping(String prefix, String uri) throwsSAXExceptionErrorHandlerImpl.javaJava代码public class ErrorHandlerImpl implements ErrorHandlerpublic void warning(SAXParseException e) throws SAXExceptionSystem.out.println(Warning +getLocationString(e)+:+e.get Message();public void error(SAXParseException e) throws SAXExceptionSystem.out.println(Error +getLocationString(e)+:+e.getMe ssage();public void fatalError(SAXParseException e) throws SAXExceptionSystem.out.println(Fatal Error +getLocationString(e)+:+e .getMessage();private String getLocationString(SAXParseException e)StringBuffer sb=new StringBuffer();String publicId=e.getPublicId();if(publicId!=null)sb.append(publicId);sb.append( );String systemId=e.getSystemId();if(systemId!=null)sb.append(systemId);sb.append( );sb.append(e.getLineNumber();sb.append(:);sb.append(e.getColumnNumber();return sb.toString();1. SaxParserTest.javaJava代码import java.io.FileInputStream;import org.xml.sax.InputSource;import org.xml.sax.XMLReader;import org.xml.sax.helpers.XMLReaderFactory;public class SaxParserTestpublic static void main(String args)tryXMLReader xmlReader=XMLReaderFactory.createXMLReader();/ 关闭或打开验证 xmlReader.setFeature(http:/xml.org/sax/features/validation,true);/ 注册事件处理器xmlReader.setContentHandler(new ContentHandlerImpl();/ 注册异常处理器xmlReader.setErrorHandler(new ErrorHandlerImpl();xmlReader.parse(new InputSource(new FileInputStream(saxdb.x ml); catch (Exception e)System.out.println(e.getMessage();第二种:DOM解析DOM中的核心概念就是节点。DOM在分析XML文档时,将将组成XML文档的各个 部分(元素、属性、文本、注释、处理指令等)映射为一个对象(节点)。在内存中, 这些节点形成一课文档树。整棵树是一个节点,树中的每一个节点也是一棵树(子 树),可以说,DOM就是对这棵树的一个对象描述,我们通过访问树中的节点来 存取XML文档的内容。PS:属性节点是附属于元素的,不能被看做是元素的子节点,更不能作为一个单 独的节点DOMPrinter.javaJava代码_import org.w3c.dom.Document;import org.w3c.dom.NamedNodeMap;import org.w3c.dom.Node;import com.sun.org.apache.xerces.internal.parsers.DOMParser;public class DOMPrinterpublic static void main(String args)try/* */* 获取 Document 对象 */DOMParser parser = new DOMParser();parser.parse(db.xml);Document document = parser.getDocument();printNode(document); catch (Exception e) e.printStackTrace();public static void printNode(Node node)short nodeType=node.getNodeType();switch(nodeType)case Node.PROCESSING_INSTRUCTION_NODE:/ 预处理指令类型 printNodeInfo(node);break;case Node.ELEMENT_NODE:/ 元素节点类型printNodeInfo(node);printAttribute(node);break;case Node.TEXT_NODE:/ 文本节点类型printNodeInfo(node);break;default:break;Node child=node.getFirstChild();while(child!=null)printNode(child);child=child.getNextSibling();/* */* 根据节点类型打印节点* param node*/public static void printNodeInfo(Node node)if (node.getNodeType() = Node.ELEMENT_NODE)System.out.println(NodeName: + node.getNodeName();else if (node.getNodeType() = Node.TEXT_NODE)String value = node.getNodeValue().trim();if (!value.equals()System.out.println(NodeValue: + value);elseSystem.out.println();elseSystem.out.println(node.getNodeName()+ : +node.getNodeValu e();/* */* 打印节点属性* param aNode 节点*/public static void printAttribute(Node aNode)NamedNodeMap attrs = aNode.getAttributes();if(attrs!=null)for (int i = 0; i attrs.getLength(); i+)Node attNode = attrs.item(i);System.out.println(Attribute: + attNode.getNodeName() + = + attNode.getNodeValue()+);DOM 生成 XML 文档:DOMCreateExample.javaJava代码_importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjavax.xml.parsers.DocumentBuilder;importjavax.xml.parsers.DocumentBuilderFactory;importjavax.xml.parsers.ParserConfigurationException;importorg.w3c.dom.Document;importorg.w3c.dom.Element;importcom.sun.org.apache.xml.internal.serialize.XMLSerializer;publicclass DOMCreateExamplepublic static void main(String args) throws ParserConfiguratio nException/DOMImplementation domImp = DOMImplementationImpl.getDOMImple mentation();DocumentBuilderFactory builderFact = DocumentBuilderFactory.ne wInstance();DocumentBuilder builder = builderFact.newDocumentBuilder();Document doc = builder.newDocument();/Document doc = domImp.createDocument(null, null, null);Element root = doc.createElement(games);Element child1 = doc.createElement(game);child1.appendChild(doc.createTextNode(Final Fantasy VII);child1.setAttribute(genre, rpg);root.appendChild(child1);doc.appendChild(root);XMLSerializer serial;tryserial = new XMLSerializer(new FileOutputStream(domcreate.x ml), null);serial.serialize(doc); catch (FileNotFoundException e1)e1.printStackTrace(); catch (IOException e)e.printStackTrace();第三种JDOM解析JDOM利用了 java语言的优秀特性,极大地简化了对XML文档的处理,相比DOM 简单易用。JDOM也使用对象树来表示XML文档,JDOM使用SAXj解析器来分析 XML文档,构建JDOM树。然而JOMD本身并没有提供解析器,它使用其他开发商 提供的标准SAX解析器,JDOM默认通过JAXP来选择解析器,可以通过手动知道 解析器的类名来设置。首先要在工程中添加 jdom 的 jar 包,这里使用 。 (见附件)JDOMConvert.javaJava代码_import java.io.File;import org.jdom.Document;import org.jdom.Element;import org.jdom.input.SAXBuilder;import org.jdom.output.Format;import org.jdom.output.XMLOutputter;public class JDOMConvertpublic static void main(String args)SAXBuilder saxBuilder=new SAXBuilder();try Document doc=saxBuilder.build(new File(domdb.xml);/首先创建好节点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);/设置节点的值eltDriver.setText(com.mysql.jdbc.Driver);eltUrl.setText(jdbc:mysql:/localhost/mySql);eltUser.setText(root);eltPassword.setText(xlc);/添加到根节点eltDb.addContent(eltDriver);eltDb.addContent(eltUrl);eltDb.addContent(eltUser);eltDb.addContent(eltPassword);/根节点设置属性eltDb.setAttribute(type,mysql);Element root=doc.getRootElement();/roo t.removeChild(db);/删除节点roo t.addCon ten t(el tDb);/增加节点/修改db节点中内容root.getChild(db).getChild(user).setText(system);root.getChild(db).getChild(password).setText(manager);XMLOutputter xmlOut=new XMLOutputter();/设置XML格式Format fmt=Format.getPrettyFormat();fmt.setIndent( );fmt.setEncoding(utf-8);xmlOut.setFormat(fmt);xmlOut.output(doc,System.out);catch (Exception e)e.printStackTrace();JDOM 生成 XML 文档:JDOMCreate.javaJava代码_import java.io.IOException;import org.jdom.Document;import org.jdom.Element;import org.jdom.output.XMLOutputter;public class JDOMCreatepublic static void main(String args)Document doc = new Document(new Element(games);Element newGame = new Element(game).setText(Final Fantasy V I);doc.getRootElement().addContent(newGame);newGame.setAttribute(genre, rpg);XMLOutputter domstream = new XMLOutputter();trydomstream.output(doc, System.out); catch (IOException e) e.printStackTrace();第四种:D0M4J解析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 文档 db.xml: Dom4jCreate.javaJava代码_import java.io.IOException;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.XMLWriter;public class Dom4jCreatepublic static void main(String args)Document doc = DocumentHelper.createDocument();doc.addProcessingInstruction(xml-stylesheet, type=text/xsl href=db.xsl);doc.addDocType(dbconfig, null,db.dtd);/Element root=DocumentHelper.createElement(dbconfig);/ doc.setRootElement(root);Element root = doc.addElement(dbconfig);Element eltDb= root.addElement(db);Element eltDriver = eltDb.addElement(driver);Element eltUrl = eltDb.addElement(url);Element eltUser = eltDb.addElement(user);Element eltPassword = eltDb.addElement(password);eltDriver.setText(com.mysql.jdbc.Driver);eltUrl.setText(jdbc:mysql:/localhost/mySql);eltUser.setText(root);eltPassword.setText(xlc);eltDb.addAttribute(type,mysql);try/ 设置输出格式OutputFormat outFmt = new OutputFormat( , true);outFmt.setEncoding(UTF-8);/*/*PrintWriter pw = new PrintWriter(System.out);doc.write(pw);pw.flush();pw.close();*/XMLWriter xmlWriter = new XMLWriter(System.out, outFmt);/ XMLWriter xmlWriter=new XMLWriter(new FileWriter(db.xml ),outFmt);xmlWriter.write(doc);xmlWriter.flush();xmlWriter.close(); catch (IOException e)e.printStackTrace();Dom4j 修改 XML 文档 db.xml:Dom4jModify.javaJava代码_import java.io.File;import java.io.FileWriter;import java.util.Iterator;import java.util.List;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;public class Dom4jModifypublic Document modifyDocument(File inputXml)trySAXReader saxReader = new SAXReader();Document document = saxReader.read(inputXml);document.addDocType(dbconfig,null,db.dtd);List list = document.content();/ Iterator iter = document.nodeIterator();Iterator iter = list.iterator();Element element = (Element) iter.next();element.element(db).attribute(type).setValue(mysql);element.element(db).element(url).setText(jdbc:mysql:/l ocalhost/mySql);element.element(db).element(driver).setText(com.mysql.j dbc.Driver);element.element(db).element(user).setText(root); element.element(db).element(password).setText(xlc);/ 设置输出格式OutputFormat outFmt = new OutputFormat( , true);outFmt.setEncoding(UTF-8);XMLWriter xmlWriter=new XMLWriter(new FileWriter(domdb-modi fied.xml),outFmt);xmlWriter.write(document);xmlWriter.flush();xmlWriter.close();return document;catch (Exception e) System.out.println(e.getMessage();return null;public static void main(String args) throws ExceptionDom4jModify dom4jParser = new Dom4jModify();Document document = dom4jParser.modifyDocument(new File(domdb.xm l);OutputFormat outFmt = new OutputFormat( , true);outFmt.setEncoding(UTF-8);XMLWriter xmlWriter = new XMLWriter(System.out,outFmt);xmlWriter.write(document);xmlWriter.flush();xmlWriter.close();
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 模板表格


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!