java高手解析xml配置文件的读取操作

h759502190 贡献于2013-10-09

作者 微软用户  创建于2010-07-25 16:06:00   修改者微软用户  修改于2010-07-25 16:09:00字数12883

文档摘要: Java和XML是黄金组合,网上已经有很多文章介绍,XML作为电子商务中数据交换,已经有其不可替代的作用,但是在平时系统开发中,我们不一定都用到数据交换,是不是无法使用XML了?  当然不是,现在已经有一个新趋势,Java程序的配置文件都开始使用XML格式,以前是使用类似windows的INI格式。(Java中也有Propertiesy这样的类专门处理这样的属性配置文件)。使用XML作为Java的配置文件有很多好处,从Tomcat的安装配置文件和J2ee的配置文件中,我们已经看到XML的普遍应用,让我们也跟随流行趋势用XML武装起来。
关键词:

JAVA高手解析XML配置文件的读取操作 阅读次数: 657次 发布时间: 2009-07-16 16:44:14发布人: 佚名 来源: IT专家网      Java和XML是黄金组合,网上已经有很多文章介绍,XML作为电子商务中数据交换,已经有其不可替代的作用,但是在平时系统开发中,我们不一定都用到数据交换,是不是无法使用XML了?   当然不是,现在已经有一个新趋势,Java程序的配置文件都开始使用XML格式,以前是使用类似windows的INI格式。(Java中也有 Propertiesy这样的类专门处理这样的属性配置文件)。使用XML作为Java的配置文件有很多好处,从Tomcat的安装配置文件和J2ee的配置文件中,我们已经看到XML的普遍应用,让我们也跟随流行趋势用XML武装起来。   现在关键是如何读取XML配置文件?有好几种XML解析器:主要有DOM和SAX ,这些区别网上文章介绍很多。   在apache的XML项目组中,目前有Xerces Xalan Cocoon几个开发XML相关技术的project.Tomcat本身使用的是 Sun 的 JAXP,而其XSL Taglib project中使用Xerces解析器。   好了,上面都是比较烦人的理论问题,还是赶快切入XML的配置文件的读取吧。   在我们的程序中,通常要有一些根据主机环境确定的变量。比如数据库访问用户名和密码,不同的主机可能设置不一样。只要更改XML配置文件,就可以正常运行。   localhost   sqlname   username   password   上面这个myenv.xml配置文件一般是放在tomcat的WEB-INF/classes目录下。   我们编制一个Java程序直接读取,将dbhost dbuser dbpassword提取出来供其他程序访问数据库用。   目前使用SAX比较的多,与DOM主要区别是 SAX是一行一行读取XML文件进行分析,适合比较大文件,DOM是一次性读入内存,显然不能对付大文件.这里我们使用SAX解析,由于SAX解析器不断在发展,网上有不少文章是针对老版本的.如果你使用JDK1.4 ,可以参考使用SAX处理XML文档一文.这里的程序是根据其改进并且经过实践调试得来的.。  import org.xml.sax.Attributes;   import org.xml.sax.helpers.DefaultHandler;   import org.xml.sax.SAXException;   import java.util.Properties;   //使用DefaultHandler的好处 是 不必陈列出所有方法,   public class ConfigParser extends DefaultHandler {   ////定义一个Properties 用来存放 dbhost dbuser dbpassword的值   private Properties props;   private String currentSet;   private String currentName;   private StringBuffer currentValue = new StringBuffer();   //构建器初始化props   public ConfigParser() {   this.props = new Properties();   }   public Properties getProps() {   return this.props;   }   //定义开始解析元素的方法. 这里是将 中的名称xxx提取出来.   public void startElement(String uri, String localName, String qName, Attributes attributes)   throws SAXException {   currentValue.delete(0, currentValue.length());   this.currentName =qName;   }   //这里是将 之间的值加入到currentValue   public void characters(char[] ch, int start, int length) throws SAXException {   currentValue.append(ch, start, length);   }   //在遇到 结束后,将之前的名称和值一一对应保存在props中   public void endElement(String uri, String localName, String qName) throws SAXException {   props.put(qName.toLowerCase(), currentValue.toString().trim());   }   }   上面的这个解析程序比较简单吧? 其实解析XML就是这么简单。 现在我们已经将dbhost dbuser dbpassword的值localhost sqlname username password提取了出来.但是这只是在在解析器内部,我们的程序还不能访问.需要再编制一个程序。  import java.util.Properties;   import javax.xml.parsers.SAXParser;   import javax.xml.parsers.SAXParserFactory;   import java.net.URL;   public class ParseXML{   //定义一个Properties 用来存放 dbhost dbuser dbpassword的值   private Properties props;   //这里的props   public Properties getProps() {   return this.props;   }   public void parse(String filename) throws Exception {   //将我们的解析器对象化   ConfigParser handler = new ConfigParser();   //获取SAX工厂对象   SAXParserFactory factory = SAXParserFactory.newInstance();   factory.setNamespaceAware(false);   factory.setValidating(false);   //获取SAX解析   SAXParser parser = factory.newSAXParser();   //得到配置文件myenv.xml所在目录. tomcat中是在WEB-INF/classes   //下例中BeansConstants是用来存放xml文件中配置信息的类,可以自己代替或定义   URL confURL = BeansConstants.class.getClassLoader().getResource(filename);   try   {   //将解析器和解析对象myenv.xml联系起来,开始解析   parser.parse(confURL.toString(), handler);   //获取解析成功后的属性 以后 我们其他应用程序只要调用本程序的props就可以提取出属性名称和值了   props = handler.getProps();   }finally{   factory=null;   parser=null;   handler=null;   }   }   }   由于我们的XML文件是使用最简单的形式 ,因此解析器相对简单,但是这已经足够对付我们的配置文件了。   判断一个程序系统的先进性,我们先看看他的配置文件,如果还在使用老套的xxx=123 这样类似.ini的文件。 我们也许会微微一笑,他又落伍了.... JAVA解析XML的四种方法比较 阅读次数: 1498次 发布时间: 2008-12-11 10:09:14发布人: 网络转载 来源: http://www.alisdn.com/wordpress/?p=137         XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API for XML),XSD(Xml Schema Definition),XSLT(Extensible Stylesheet Language Transformations),具体可参阅w3c官方网站文档http://www.w3.org获取更多信息。         XML在不同的语言里解析方式都是一样的,只不过实现的语法不同而已。基本的解析方式有两种,一种叫SAX,另一种叫DOM。SAX是基于事件流的解析,DOM是基于XML文档树结构的解析。假设我们XML的内容和结构如下:          ddviplinux     m     30   本文使用JAVA语言来实现DOM与SAX的XML文档生成与解析。 首先定义一个操作XML文档的接口XmlDocument 它定义了XML文档的建立与解析的接口。 package com.alisoft.facepay.framework.bean; /**  *  * @author hongliang.dinghl  * 定义XML文档建立与解析的接口  */ public interface XmlDocument { /**  * 建立XML文档  * @param fileName 文件全路径名称  */ public void createXml(String fileName); /**  * 解析XML文档  * @param fileName 文件全路径名称  */ public void parserXml(String fileName); } 1. DOM生成和解析XML文档         为 XML 文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。 package com.alisoft.facepay.framework.bean; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; /**  *  * @author hongliang.dinghl  * DOM生成与解析XML文档  */ public class DomDemo implements XmlDocument {         private Document document;       private String fileName;       public void init() {        try {            DocumentBuilderFactory factory = DocumentBuilderFactory                   .newInstance();            DocumentBuilder builder = factory.newDocumentBuilder();            this.document = builder.newDocument();        } catch (ParserConfigurationException e) {            System.out.println(e.getMessage());        }     }       public void createXml(String fileName) {          Element root = this.document.createElement(“employees”);        this.document.appendChild(root);        Element employee = this.document.createElement(“employee”);        Element name = this.document.createElement(“name”);        name.appendChild(this.document.createTextNode(“丁宏亮“));        employee.appendChild(name);        Element sex = this.document.createElement(“sex”);        sex.appendChild(this.document.createTextNode(“m”));        employee.appendChild(sex);        Element age = this.document.createElement(“age”);        age.appendChild(this.document.createTextNode(“30″));        employee.appendChild(age);        root.appendChild(employee);          TransformerFactory tf = TransformerFactory.newInstance();        try {            Transformer transformer = tf.newTransformer();            DOMSource source = new DOMSource(document);            transformer.setOutputProperty(OutputKeys.ENCODING, “gb2312″);            transformer.setOutputProperty(OutputKeys.INDENT, “yes”);            PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));            StreamResult result = new StreamResult(pw);            transformer.transform(source, result);            System.out.println(“生成XML文件成功!”);        } catch (TransformerConfigurationException e) {              System.out.println(e.getMessage());        } catch (IllegalArgumentException e) {              System.out.println(e.getMessage());        } catch (FileNotFoundException e) {              System.out.println(e.getMessage());        } catch (TransformerException e) {              System.out.println(e.getMessage());        }       }       public void parserXml(String fileName) {        try {            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();            DocumentBuilder db = dbf.newDocumentBuilder();            Document document = db.parse(fileName);            NodeList employees = document.getChildNodes();            for (int i = 0; i < employees.getLength(); i++) {               Node employee = employees.item(i);               NodeList employeeInfo = employee.getChildNodes();               for (int j = 0; j < employeeInfo.getLength(); j++) {                   Node node = employeeInfo.item(j);                   NodeList employeeMeta = node.getChildNodes();                   for (int k = 0; k < employeeMeta.getLength(); k++) {                      System.out.println(employeeMeta.item(k).getNodeName()                             + “:” + employeeMeta.item(k).getTextContent());                   }               }            }            System.out.println(“解析完毕“);        } catch (FileNotFoundException e) {            System.out.println(e.getMessage());        } catch (ParserConfigurationException e) {            System.out.println(e.getMessage());        } catch (SAXException e) {            System.out.println(e.getMessage());        } catch (IOException e) {            System.out.println(e.getMessage());        }      } } 2. SAX生成和解析XML文档         为解决DOM的问题,出现了SAX。SAX ,事件驱动。当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。优点:不用事先调入整个文档,占用资源少;SAX解析器代码比DOM解析器代码小,适于Applet,下载。缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;使用场合:Applet;只需XML文档的少量内容,很少回头访问;机器内存少; package com.alisoft.facepay.framework.bean; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import javax.xml.parsers.ParserConfigurationException; 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; /**  *  * @author hongliang.dinghl  * SAX文档解析  */ public class SaxDemo implements XmlDocument {       public void createXml(String fileName) {         System.out.println(“<<”+filename+“>>”);     }       public void parserXml(String fileName) {        SAXParserFactory saxfac = SAXParserFactory.newInstance();          try {              SAXParser saxparser = saxfac.newSAXParser();              InputStream is = new FileInputStream(fileName);              saxparser.parse(is, new MySAXHandler());          } catch (ParserConfigurationException e) {              e.printStackTrace();          } catch (SAXException e) {              e.printStackTrace();          } catch (FileNotFoundException e) {              e.printStackTrace();          } catch (IOException e) {              e.printStackTrace();          }       }   }   class MySAXHandler extends DefaultHandler {       boolean hasAttribute = false;       Attributes attributes = null;       public void startDocument() throws SAXException {          System.out.println(“文档开始打印了“);       }       public void endDocument() throws SAXException {          System.out.println(“文档打印结束了“);       }       public void startElement(String uri, String localName, String qName,       Attributes attributes) throws SAXException {          if (qName.equals(“employees”)) {              return;          }          if (qName.equals(“employee”)) {              System.out.println(qName);          }          if (attributes.getLength() > 0) {              this.attributes = attributes;              this.hasAttribute = true;          }       }       public void endElement(String uri, String localName, String qName)       throws SAXException {          if (hasAttribute && (attributes != null)) {              for (int i = 0; i < attributes.getLength(); i++) {                 System.out.println(attributes.getQName(0)                      + attributes.getValue(0));              }          }       }       public void characters(char[] ch, int start, int length)       throws SAXException {          System.out.println(new String(ch, start, length));       }   } 3. DOM4J生成和解析XML文档          DOM4J 是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML,特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J。 package com.alisoft.facepay.framework.bean; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.util.Iterator; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; /**  *  * @author hongliang.dinghl  * Dom4j 生成XML文档与解析XML文档  */ public class Dom4jDemo implements XmlDocument {       public void createXml(String fileName) {        Document document = DocumentHelper.createDocument();        Element employees=document.addElement(“employees”);        Element employee=employees.addElement(“employee”);        Element name= employee.addElement(“name”);        name.setText(“ddvip”);        Element sex=employee.addElement(“sex”);        sex.setText(“m”);        Element age=employee.addElement(“age”);        age.setText(“29″);        try {            Writer fileWriter=new FileWriter(fileName);            XMLWriter xmlWriter=new XMLWriter(fileWriter);            xmlWriter.write(document);            xmlWriter.close();        } catch (IOException e) {                       System.out.println(e.getMessage());        }                   }         public void parserXml(String fileName) {         File inputXml=new File(fileName);         SAXReader saxReader = new SAXReader();         try {            Document document = saxReader.read(inputXml);            Element employees=document.getRootElement();            for(Iterator i = employees.elementIterator(); i.hasNext();){                Element employee = (Element) i.next();                for(Iterator j = employee.elementIterator(); j.hasNext();){                    Element node=(Element) j.next();                    System.out.println(node.getName()+“:”+node.getText());                }              }        } catch (DocumentException e) {            System.out.println(e.getMessage());        }      System.out.println(“dom4j parserXml”);     }     }   4. JDOM生成和解析XML         为减少DOM、SAX的编码量,出现了JDOM;优点:20-80原则,极大减少了代码量。使用场合:要实现的功能简单,如解析、创建等,但在底层,JDOM还是使用SAX(最常用)、DOM、Xanan文档。 package com.alisoft.facepay.framework.bean; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; 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; /**  *  * @author hongliang.dinghl  * JDOM 生成与解析XML文档  *  */ public class JDomDemo implements XmlDocument {       public void createXml(String fileName) {       Document document;       Element  root;       root=new Element(“employees”);       document=new Document(root);       Element employee=new Element(“employee”);       root.addContent(employee);       Element name=new Element(“name”);       name.setText(“ddvip”);       employee.addContent(name);       Element sex=new Element(“sex”);       sex.setText(“m”);       employee.addContent(sex);       Element age=new Element(“age”);       age.setText(“23″);       employee.addContent(age);       XMLOutputter XMLOut = new XMLOutputter();       try {        XMLOut.output(document, new FileOutputStream(fileName));     } catch (FileNotFoundException e) {        e.printStackTrace();     } catch (IOException e) {        e.printStackTrace();     }       }       public void parserXml(String fileName) {        SAXBuilder builder=new SAXBuilder(false);        try {            Document document=builder.build(fileName);            Element employees=document.getRootElement();            List employeeList=employees.getChildren(“employee”);            for(int i=0;i

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 3 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档