xml的解析方法及源代码

xiaoxiao2025-12-05  6

xml的解析方法及源代码

第一种:SAX解析 SAX处理机制:SAX是一种基于事件驱动的API。利用SAX解析XML文档,牵涉到两个部分:解析器和事件处理器。解析器负责读取XML文档,并向事件处理器发生事件,如元素开始和元素结束事件;而事件处理器则负责对事件做出响应,对传递的XML数据进行处理。

测试用的xml文件:db.xml

Xml代码

<?xml version="1.0" encoding="UTF-8"?>  

<!--<!DOCTYPE dbconfig SYSTEM "db.dtd">-->  

<dbconfig>  

 <db type="oracle">  

  <driver>oracle.jdbc.driver.OracleDriver</driver>  

  <url>jdbc:oracle:thin:@localhost:1521:oracle</url>  

  <user>scott</user>  

  <password>tiger</password>  

 </db>  

</dbconfig>  

<?xml version="1.0" encoding="UTF-8"?> <!--<!DOCTYPE dbconfig SYSTEM "db.dtd">--> <dbconfig> <db type="oracle"> <driver>oracle.jdbc.driver.OracleDriver</driver> <url>jdbc:oracle:thin:@localhost:1521:oracle</url> <user>scott</user> <password>tiger</password> </db> </dbconfig>

DTD文件db.dtd

Xml代码

<!ELEMENT dbconfig (db+)>  

<!ELEMENT db (driver,url,user,password)>  

<!ELEMENT driver (#PCDATA)>  

<!ELEMENT url (#PCDATA)>  

<!ELEMENT user (#PCDATA)>  

<!ELEMENT password (#PCDATA)>  

<!ATTLIST db type CDATA #REQUIRED>  

<!ELEMENT dbconfig (db+)> <!ELEMENT db (driver,url,user,password)> <!ELEMENT driver (#PCDATA)> <!ELEMENT url (#PCDATA)> <!ELEMENT user (#PCDATA)> <!ELEMENT password (#PCDATA)> <!ATTLIST db type CDATA #REQUIRED>

SAX解析实例一org.xml.sax.DefalutHandler类:  可以扩展该类,给出自己的解析实现SAXPrinter.java

Java代码

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 SAXException   

    {   

        System.out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");   

    }   

       

  /** *//**  

   * 接收处理指令事件  

   */  

    public void processingInstruction(String target, String data) throws SAXException   

    {   

        System.out.println("<?"+target+" "+data+"?>");   

    }   

       

  /** *//**  

   * 元素开始事件  

  * 参数说明:  

   *   uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。  

   *   localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。  

   *   qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。  

   *   attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。  

   */  

    public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException   

    {   

        System.out.print("<"+qName);//输出元素名称   

        int len=attrs.getLength();//元素属性列表长度   

           

    //利用循环输出属性列表   

        for(int i=0;i<len;i++)   

        {   

            System.out.print(" ");   

            System.out.print(attrs.getQName(i));   

            System.out.print("=\"");   

            System.out.print(attrs.getValue(i));   

            System.out.print("\"");   

        }   

        System.out.print(">");   

    }   

       

  /** *//**  

   * 元素中字符数据事件:接收元素中字符数据  

   * 注意:1.应用程序不要试图读取ch数组指定范围外的数据,(即start至length之外)  

   *      2.有些解析器将使用ignorableWhitespace()方法来报告元素内容中的空白,而不是characters()方法,如:进行有效性验证的解析器  

   */  

    public void characters(char[] ch, int start, int length) throws SAXException   

    {   

        System.out.print(new String(ch,start,length));   

    }   

  

  /** *//**  

   * 结束元素事件  

   */  

    public void endElement(String uri, String localName, String qName) throws SAXException   

    {   

        System.out.print("</"+qName+">");   

    }   

 

    public static void main(String[] args)   

    {   

       SAXParserFactory spf=SAXParserFactory.newInstance();   

           

        try  

        {   

        SAXParser sp=spf.newSAXParser();   

          sp.parse(new File("db.xml"),new SAXPrinter());   

       }   

        catch (Exception e)   

        {   

            e.printStackTrace();   

        }   

    }   

}  

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 SAXException { System.out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); } /** *//** * 接收处理指令事件 */ public void processingInstruction(String target, String data) throws SAXException { System.out.println("<?"+target+" "+data+"?>"); } /** *//** * 元素开始事件 * 参数说明: * uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。 * localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。 * qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。 * attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。 */ public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException { System.out.print("<"+qName);//输出元素名称 int len=attrs.getLength();//元素属性列表长度 //利用循环输出属性列表 for(int i=0;i<len;i++) { System.out.print(" "); System.out.print(attrs.getQName(i)); System.out.print("=\""); System.out.print(attrs.getValue(i)); System.out.print("\""); } System.out.print(">"); } /** *//** * 元素中字符数据事件:接收元素中字符数据 * 注意:1.应用程序不要试图读取ch数组指定范围外的数据,(即start至length之外) * 2.有些解析器将使用ignorableWhitespace()方法来报告元素内容中的空白,而不是characters()方法,如:进行有效性验证的解析器 */ public void characters(char[] ch, int start, int length) throws SAXException { System.out.print(new String(ch,start,length)); } /** *//** * 结束元素事件 */ public void endElement(String uri, String localName, String qName) throws SAXException { System.out.print("</"+qName+">"); } public static void main(String[] args) { SAXParserFactory spf=SAXParserFactory.newInstance(); try { SAXParser 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.java

Java代码 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 SAXException      {        System.out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");      }           /** *//**     * 接收处理指令事件     */     public void processingInstruction(String target, String data) throws SAXException      {        System.out.println("<?"+target+" "+data+"?>");      }           /** *//**     * 元素开始事件     * 参数说明:     *   uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。     *   localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。     *   qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。     *   attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。     */     public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException      {        System.out.print("<"+qName);//输出元素名称        int len=attrs.getLength();//元素属性列表长度                //利用循环输出属性列表        for(int i=0;i<len;i++)        {          System.out.print(" ");          System.out.print(attrs.getQName(i));          System.out.print("=\"");          System.out.print(attrs.getValue(i));          System.out.print("\"");        }        System.out.print(">");      }           /** *//**     * 元素中字符数据事件:接收元素中字符数据     * 注意:1.应用程序不要试图读取ch数组指定范围外的数据,(即start至length之外)     *      2.有些解析器将使用ignorableWhitespace()方法来报告元素内容中的空白,而不是characters()方法,如:进行有效性验证的解析器     */     public void characters(char[] ch, int start, int length) throws SAXException      {        System.out.print(new String(ch,start,length));      }        /** *//**     * 结束元素事件     */     public void endElement(String uri, String localName, String qName) throws SAXException      {        System.out.print("</"+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      {            }     }    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 SAXException { System.out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); } /** *//** * 接收处理指令事件 */ public void processingInstruction(String target, String data) throws SAXException { System.out.println("<?"+target+" "+data+"?>"); } /** *//** * 元素开始事件 * 参数说明: * uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。 * localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。 * qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。 * attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。 */ public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException { System.out.print("<"+qName);//输出元素名称 int len=attrs.getLength();//元素属性列表长度 //利用循环输出属性列表 for(int i=0;i<len;i++) { System.out.print(" "); System.out.print(attrs.getQName(i)); System.out.print("=\""); System.out.print(attrs.getValue(i)); System.out.print("\""); } System.out.print(">"); } /** *//** * 元素中字符数据事件:接收元素中字符数据 * 注意:1.应用程序不要试图读取ch数组指定范围外的数据,(即start至length之外) * 2.有些解析器将使用ignorableWhitespace()方法来报告元素内容中的空白,而不是characters()方法,如:进行有效性验证的解析器 */ public void characters(char[] ch, int start, int length) throws SAXException { System.out.print(new String(ch,start,length)); } /** *//** * 结束元素事件 */ public void endElement(String uri, String localName, String qName) throws SAXException { System.out.print("</"+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 { } }

ErrorHandlerImpl.java 

Java代码 public class ErrorHandlerImpl implements ErrorHandler   {        public void warning(SAXParseException e) throws SAXException      {        System.out.println("[Warning ]"+getLocationString(e)+":"+e.getMessage());      }        public void error(SAXParseException e) throws SAXException      {        System.out.println("[Error ]"+getLocationString(e)+":"+e.getMessage());      }        public void fatalError(SAXParseException e) throws SAXException      {        System.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();      }   }   public class ErrorHandlerImpl implements ErrorHandler { public void warning(SAXParseException e) throws SAXException { System.out.println("[Warning ]"+getLocationString(e)+":"+e.getMessage()); } public void error(SAXParseException e) throws SAXException { System.out.println("[Error ]"+getLocationString(e)+":"+e.getMessage()); } public void fatalError(SAXParseException e) throws SAXException { System.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(); } }

SaxParserTest.java 

Java代码 import java.io.FileInputStream;      import org.xml.sax.InputSource;    import org.xml.sax.XMLReader;    import org.xml.sax.helpers.XMLReaderFactory;       public class SaxParserTest    {      public static void main(String[] args)      {        try       {         XMLReader 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.xml")));        } catch (Exception e)        {         System.out.println(e.getMessage());       }     }   }   import java.io.FileInputStream; import org.xml.sax.InputSource; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; public class SaxParserTest { public static void main(String[] args) { try { XMLReader 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.xml"))); } catch (Exception e) { System.out.println(e.getMessage()); } } }

第二种:DOM解析DOM中的核心概念就是节点。DOM在分析XML文档时,将将组成XML文档的各个部分(元素、属性、文本、注释、处理指令等)映射为一个对象(节点)。在内存中,这些节点形成一课文档树。整棵树是一个节点,树中的每一个节点也是一棵树(子树),可以说,DOM就是对这棵树的一个对象描述,我们通过访问树中的节点来存取XML文档的内容。PS:属性节点是附属于元素的,不能被看做是元素的子节点,更不能作为一个单独的节点

DOMPrinter.java

Java代码 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 DOMPrinter    {      public 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);          else           System.out.println();        }else       {          System.out.println(node.getNodeName()+" : "+node.getNodeValue());        }     }           /** *//**     * 打印节点属性     * @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()+"\"");          }       }     }   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 DOMPrinter { public 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); else System.out.println(); }else { System.out.println(node.getNodeName()+" : "+node.getNodeValue()); } } /** *//** * 打印节点属性 * @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.java 

Java代码 import java.io.FileNotFoundException;    import java.io.FileOutputStream;    import java.io.IOException;       import javax.xml.parsers.DocumentBuilder;    import javax.xml.parsers.DocumentBuilderFactory;    import javax.xml.parsers.ParserConfigurationException;       import org.w3c.dom.Document;    import org.w3c.dom.Element;       import com.sun.org.apache.xml.internal.serialize.XMLSerializer;      pu 相关资源:XML文件解析源码
转载请注明原文地址: https://www.6miu.com/read-5040385.html

最新回复(0)