xml解析
XML解析 DOM(Document Object Model)解析 优点:增删改查方便 缺点:需要读取整个xml才能构建DOM树。对于较大的xml,容易内存溢出 SAX(Simple API for XML)解析 优点:在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作 缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;无状态性;从事件中只能得到文本,但不知该文本属于哪个元素 适用于只查询 JAXP(Java API for XML Processing) 可以进行DOM解析和SAX解析,由SUN公司提供,存在于JDK中 所在包: org.w3c.dom:提供DOM方式解析XML的标准接口 org.xml.sax:提供SAX方式解析XML的标准接口 javax.xml:提供了解析XML文档的类 JAXP调用dom方式创建xml 创建一个如下所示的xml文件 <?xmlversion="1.0"encoding="UTF-8"?> <recipetype="dessert"> <recipenamecuisine="american"servings="1">IceCreamSundae</recipename> </recipe> java代码如下: publicstaticvoidcreateXML(StringfileName)throwsException{ //获取DocumentBuilderFactory DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance(); //获取DocumentBuilder DocumentBuilderbuilder=factory.newDocumentBuilder(); //获取Document对象 Documentdocument=builder.newDocument(); //设置xml声明 document.setXmlStandalone(false);//指定此文档是否是单独的的属性 //创建跟元素<recipetype="dessert"> ElementrootElement=document.createElement("recipe"); //设置元素属性 rootElement.setAttribute("type","dessert"); //创建元素<recipename> Elementrecipename=document.createElement("recipename"); //为recipename元素添加属性 recipename.setAttribute("cuisine","american"); recipename.setAttribute("servings","1"); //设置recipename元素中的值 recipename.setTextContent("IceCreamSundae"); rootElement.appendChild(recipename); //将根元素添加到document中 document.appendChild(rootElement); //将xml映射到文件 booleanflag=true; try{ //获取TransformerFactorty用于创建Transformer和Templates对象。 TransformerFactorytf=TransformerFactory.newInstance(); //获取Transformer对象处理来自不同源的XML,并将转换输出写入各种接收器 //注意:在多线程同时运行时不能使用此类的对象 Transformertransformer=tf.newTransformer(); DOMSourcesource=newDOMSource(document); //设置编码格式 transformer.setOutputProperty(OutputKeys.ENCODING,"UTF-8"); //设置indent="yes"|"no".indent指定了当输出结果树时,Transformer是否可以添加额外的空白;其值必须为yes或no。就是幽默诶有进行格式化 transformer.setOutputProperty(OutputKeys.INDENT,"yes"); PrintWriterpw=newPrintWriter(newFileOutputStream(fileName)); StreamResultresult=newStreamResult(pw); transformer.transform(source,result); }catch(Exceptione){ flag=false; e.printStackTrace(); } if(flag){ System.out.println("生成XML文件成功!"); }else{ System.out.println("生成XML文件失败!"); } } JAXP调用SAX解析XML publicstaticvoidmain(String[]args)throwsParserConfigurationException,SAXException,IOException{ //创建解析器工厂, SAXParserFactoryspf=SAXParserFactory.newInstance(); //得到解析器, SAXParserparser=spf.newSAXParser(); //得到读取器 XMLReaderreader=parser.getXMLReader(); //给内容注册内容处理器 // reader.setContentHandler(newMyContentHandler()); reader.setContentHandler(newDefaultHandler(){ publicvoidstartDocument()throwsSAXException{ //TODOAuto-generatedmethodstub super.startDocument(); System.out.println("读取文档开始"); } publicvoidendDocument()throwsSAXException{ //TODOAuto-generatedmethodstub super.endDocument(); System.out.println("读取文档结束"); } }); //解析文档 reader.parse("book.xml"); } 由于dom用来增删改比较方便,所以选择了用期进行创建修改操作,而SAX方式可以快速的进行查找便利,所以选择用来做解析遍历,此处就不在编写dom解析xml的方式了。 第三方解析XML--DOM4J 解析XML,对XML进行遍历 首先要获取到一个Document对象 publicDocumentparse(URLurl)throwsDocumentException{ SAXReaderreader=newSAXReader(); Documentdocument=reader.read(url); returndocument; } 然后开始进行遍历,在文档中找到两种方法见代码: //方法1 publicvoidbar(Documentdocument)throwsDocumentException{ Elementroot=document.getRootElement(); //iteratethroughchildelementsofroot for(Iteratori=root.elementIterator();i.hasNext();){ Elementelement=(Element)i.next(); //dosomething } //iteratethroughchildelementsofrootwithelementname"foo" for(Iteratori=root.elementIterator("foo");i.hasNext();){ Elementfoo=(Element)i.next(); //dosomething } //iteratethroughattributesofroot for(Iteratori=root.attributeIterator();i.hasNext();){ Attributeattribute=(Attribute)i.next(); //dosomething } } //方法2 publicvoidtreeWalk(Documentdocument){ treeWalk(document.getRootElement()); } publicvoidtreeWalk(Elementelement){ for(inti=0,size=element.nodeCount();i<size;i++){ Nodenode=element.node(i); if(nodeinstanceofElement){ treeWalk((Element)node); } else{ //dosomething.... } } } 在文档中表明:如果说xml文件比较大的话,建议用第二种方法,可以避免了创建每个循环迭代器对象的成本。 Dom4j创建xml /** *创建XML */ publicDocumentcreateDocument(){ Documentdocument=DocumentHelper.createDocument(); Elementroot=document.addElement("root"); Elementauthor1=root.addElement("author") .addAttribute("name","James") .addAttribute("location","UK") .addText("JamesStrachan"); Elementauthor2=root.addElement("author") .addAttribute("name","Bob") .addAttribute("location","US") .addText("BobMcWhirter"); returndocument; } /** *将XML进行持久化(保存到文件) */ publicvoidwrite(Documentdocument)throwsIOException{ XMLWriterwriter=newXMLWriter( newFileWriter("output.xml") ); writer.write(document); writer.close(); /*这个地方是定义输出格式 *OutputFormat.createPrettyPrint()方便阅读的格式(带空格,带换行) *OutputFormat.createCompactFormat();没有空格换行 *format.setEncoding(Stringencoding)可以设置编码格式,默认utf-8 */ OutputFormatformat=OutputFormat.createPrettyPrint(); writer=newXMLWriter(System.out,format); writer.write(document); } 以上dom4j代码摘自文档中 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |