canofy 发表于 2013-2-4 20:15:51

xml解析整理

这是自己整理的xml解析,参考了网上的例子:
<?xml version="1.0" encoding="UTF-8"?><catalog>    <!--An XML Catalog-->    <books title="XML Zone" publisher="IBM developerWorks">      <book level="Intermediate" date="December-2001">            <title>Java OO Book</title>            <author>author</author>      </book>    </books></catalog>
1、jdom解析
package cn.xml;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.Iterator;import java.util.List;import org.jdom.Document;import org.jdom.Element;import org.jdom.JDOMException;import org.jdom.input.SAXBuilder;import org.jdom.output.XMLOutputter;/** * yicha* Dec 2, 2008 JDom解析 */public class JDomParse{/** * @param args * @throws IOException* @throws FileNotFoundException* @throws JDOMException*/public static void main(String[] args) throws FileNotFoundException, IOException, JDOMException {String xmlpath="c:/catalog.xml";//使用JDOM首先要指定使用什么解析器SAXBuilder builder=new SAXBuilder(false);//这表示使用的是默认的解析器//得到Document,以后要进行的所有操作都是对这个Document操作的Document doc=builder.build(xmlpath);//得到根元素Element root=doc.getRootElement();//得到元素(节点)的集合List bookslist=root.getChildren("books");//轮循List集合for (Iterator iter = bookslist.iterator(); iter.hasNext();) {   Element books= (Element) iter.next();   List bookList=books.getChildren("book");   for(Iterator it=bookList.iterator();it.hasNext();){   Element book= (Element) it.next();   //取得元素的属性   String level=book.getAttributeValue("level");   System.out.println(level);   //取得元素的子元素(为最低层元素)的值注意的是,必须确定book元素的名为“name”的子元素只有一个。   String author=book.getChildTextTrim("author");   System.out.println(author);          //改变元素(为最低层元素)的值;对Document的修改,并没有在实际的XML文档中进行修改   book.getChild("author").setText("author_test");   }   }//保存Document的修改到XML文件中//XMLOutputter outputter=new XMLOutputter();//outputter.output(doc,new FileOutputStream(xmlpath));}}

dom解析:
package cn.xml;import java.io.File;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.NodeList;/** * yicha* Dec 1, 2008 * DOM解析*/public class DomPhase {/** * @param args */public static void main(String[] args) {long lasting =System.currentTimeMillis();try{File f=new File("c:/catalog.xml");DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();DocumentBuilder builder=factory.newDocumentBuilder();Document doc = builder.parse(f);NodeList nl = doc.getElementsByTagName("author");for (int i=0;i<nl.getLength();i++){System.out.println("firstname:" + doc.getElementsByTagName("firstname").item(i).getFirstChild().getNodeValue());System.out.println(" lastname:" + doc.getElementsByTagName("lastname").item(i).getFirstChild().getNodeValue());}}catch(Exception e){e.printStackTrace();}System.out.println("运行时间:"+(System.currentTimeMillis() - lasting)+" 毫秒");} }
dom4j解析:
package cn.xml;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.util.HashMap;import java.util.Iterator;import java.util.List;import org.dom4j.Attribute;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;/** * yicha* Dec 1, 2008*/public class Dom4JPhase {/** * 产生xml文档 */public void generateDocument(){   //使用 DocumentHelper 类创建一个文档实例。 DocumentHelper 是生成 XML 文档节点的 dom4j API 工厂类      Document document = DocumentHelper.createDocument();            //使用 addElement()方法创建根元素catalog , addElement()用于向 XML 文档中增加元素      Element catalogElement = document.addElement("catalog");   //在 catalog 元素中使用 addComment() 方法添加注释"An XML catalog"      catalogElement.addComment("An XML Catalog");    //在 catalog 元素中使用 addProcessingInstruction() 方法增加一个处理指令 (不知有什么用)//   catalogElement.addProcessingInstruction("target","text");   //在 catalog 元素中使用 addElement() 方法增加 journal 节点      Element booksElement = catalogElement.addElement("books");      //使用 addAttribute() 方法向 book节点添加 title 和 publisher 属性      booksElement.addAttribute("title", "XML Zone");      booksElement.addAttribute("publisher", "IBM developerWorks");      //添加子节点   Element bookElement=booksElement.addElement("book");      //添加属性      bookElement.addAttribute("level", "Intermediate");      bookElement.addAttribute("date", "December-2001");    //添加节点   Element titleElement=bookElement.addElement("title");   //添加内容   titleElement.setText("Java OO Book");   //添加节点   Element authorElement=bookElement.addElement("author");   //添加节点   authorElement.setText("author");               //可以使用 addDocType() 方法添加文档类型说明      //这样就向 XML 文档中增加文档类型说明:   //   document.addDocType("catalog","nikee","file://c:/Dtds/catalog.dtd");      try{       FileOutputStream fos=new FileOutputStream("c:/catalog.xml");          OutputFormat of=new OutputFormat("    ", true);          XMLWriter xw=new XMLWriter(fos, of);          xw.write( document );          xw.close();      } catch(IOException e)    {       System.out.println(e.getMessage());      }   }   /** * 读取xml文件的元素值 * @param list */public void getXMLValue(List list){//List list=element.elements();if(list==null||list.size()==0){return;}for(int i=0;i<list.size();i++){ Element foo = (Element) list.get(i); System.out.println(foo.getName()+"="+foo.getData().toString().trim()); List result=foo.elements(); if(result!=null||result.size()>0){ this.getXMLValue(result);//递归 }}}/** * 根据节点名获取值 * @param fileName * @param name */public void getElement(String fileName,String name){Document document = this.readXML(fileName);Element root=this.getRootElement(document);// 枚举名称为name的节点for ( Iterator i = root.elementIterator(name); i.hasNext();) {    Element foo = (Element) i.next();    System.out.println(foo.getName()+"="+foo.getData());}// 枚举所有子节点//    for ( Iterator i = root.elementIterator(); i.hasNext(); ) {//       Element foo = (Element) i.next();//       System.out.println(foo.getName()+"="+foo.getData());//    }}/** * 根据节点名获取值 * @param fileName * @param name */public void getAttribute(Element element,String name){// 枚举属性    for ( Iterator i = element.attributeIterator(); i.hasNext(); ) {       Attribute attribute = (Attribute) i.next();       System.out.println(attribute.getName()+"="+attribute.getData());    }}/** * 得到root节点 * @param doc * @return */public Element getRootElement(Document doc){       return doc.getRootElement();}/** * 读取xml文件 * @param fileName * @return 返回document对象 */public Document readXML(String fileName){ SAXReader saxReader = new SAXReader(); Document document=null;try {   document = saxReader.read(new File(fileName));}catch(Exception e){System.out.println("readXML has error:"+e.getMessage());e.printStackTrace();}return document;} /*** 遍历整个XML文件,获取所有节点的值与其属性的值,并放入HashMap中* @param 待遍历的XML文件*/ public void iterateWholeXML(String filename){   Document document = this.readXML(filename);Element root=this.getRootElement(document);List list=root.elements();this.getXMLValue(list);}   public static void main(String[] argv){   Dom4JPhase dom4j=new Dom4JPhase();   dom4j.generateDocument();String fileName="c:/catalog.xml";String elementName="book";//dom4j.generateDocument();long lasting = System.currentTimeMillis();dom4j.iterateWholeXML(fileName);//dom4j.getElement(fileName, elementName);    System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + " 毫秒");    }}
rax解析:
package cn.xml;/** * yicha* Jul 3, 2008*/import java.net.URL;import java.util.Properties;import org.xml.sax.*;import org.xml.sax.helpers.*;import javax.xml.parsers.*;/** * SAX 解析 * @author yicha * */public class SAXReader extends DefaultHandler { /*props:用于存放解析器解析出来的的节点和节点对应的属性,为哈希表   * currentName:当前节点的名称   * currentValue:用于存放当前节点所对应的属性值   */    private Properties props;    private String currentName;    private StringBuffer currentValue = new StringBuffer();       public SAXReader() {      this.props=new Properties();    }      public Properties getPrpos() {      return this.props;    }          public String getCurrentName(){      return currentName;    }          /*   * 读取<xxx>中的值xxx并将其付给qname,通知解析器解析当前节点对应的值。同时对currentValue缓冲器清空,用来保存当前qname对应属性值。   * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)   */   public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException{      currentValue.delete(0,currentValue.length());      this.currentName=qName;    }            /*读取<xxx></xxx>之间的属性值,并将其首先以字符形式保存至字符数组ch中,并记录对应长度,以确保以       * length为长度的字符为一个整体,然后讲字符数组中的内容按照length长度为整体加到currentValue缓冲器中       * 每次读取xml文件后只会在ch中保存当前所解析到的值,currentValue中也只会有当前的节点所对应的唯一值   */    public void characters(char[] ch,int start,int length)    throws SAXException    {      currentValue.append(ch,start,length);    }    /* 当遇到</xxx>时,将当前的qname,和qname所对应的位于currentValue缓冲器中的值保存到props这个哈希表中去,供外部程序调用   * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)   */    public void endElement(String uri, String localName, String qName)throws SAXException   {      props.put(qName.toLowerCase(), currentValue.toString().trim());    }               public static void main(String args[]) {long lasting = System.currentTimeMillis();String fileName="c:/catalog.xml";SAXParserFactory sf = SAXParserFactory.newInstance();SAXParser sp;try {sp = sf.newSAXParser();SAXReader reader = new SAXReader();sp.parse(new InputSource(fileName), reader);} catch (Exception e) {e.printStackTrace();}System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + "毫秒");}}
package cn.xml;import java.net.URL;import java.util.Iterator;import java.util.Properties;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;/** * yicha* Dec 1, 2008*/public class SaxPhase { private Properties props;public SaxPhase(){ props=new Properties(); }   public Properties getProps(){      return this.props; }publicvoid parse(String filename)    throws Exception{      //实例化解析器SAXReader handler = new SAXReader();               //实例化用于分析的工厂      SAXParserFactory factory = SAXParserFactory.newInstance();               //实例化分析类      SAXParser parser = factory.newSAXParser();               //得到xml文件对应的路径      URL confURL = SAXReader.class.getClassLoader().getResource(filename);      try{            parser.parse(confURL.toString(), handler);            props = handler.getPrpos();      }finally {                      //销毁已过期对象                        factory=null;            parser=null;            handler=null;      }            }      /*   * 提供给外部程序调用的用于返回程序所对应需要的xml文件属性的方法   */ public String getElementValue(String elementName) {      //elementValue:对应于elementName的节点的属性值      String elementValue=null;      elementValue=props.getProperty(elementName);      return elementValue; }/** * @param args */public static void main(String[] args) {SaxPhase sp=new SaxPhase();String filename="testXML.xml";try {sp.parse(filename);Properties props=sp.getProps();//System.out.println(props.size()+"");Iterator it=props.keySet().iterator();while(it.hasNext()){String key=it.next().toString();System.out.println(props.get(key)+"");}//System.out.println(sp.getElementValue("driver-class"));} catch (Exception e) {e.printStackTrace();}}}
页: [1]
查看完整版本: xml解析整理