`

xml的四种解析方法及源代码(SAX、DOM、JDOM、DOM4J

    博客分类:
  • java
xml 
阅读更多
[/size][size=x-small][b]xml的四种解析方法及源代码(SAX、DOM、JDOM、DOM4J)

第一种: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;  
 
public class DOMCreateExample  
{  
  public static void main(String[] args) throws ParserConfigurationException  
  {  
    //DOMImplementation domImp = DOMImplementationImpl.getDOMImplementation();  
    DocumentBuilderFactory builderFact = DocumentBuilderFactory.newInstance();  
    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;  
    try 
    {  
      serial = new XMLSerializer(new FileOutputStream("domcreate.xml"), null);  
      serial.serialize(doc);  
    } catch (FileNotFoundException e1)  
    {  
      e1.printStackTrace();  
    } catch (IOException e)  
    {  
      e.printStackTrace();  
    }  
  }  


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;

public class DOMCreateExample
{
  public static void main(String[] args) throws ParserConfigurationException
  {
    //DOMImplementation domImp = DOMImplementationImpl.getDOMImplementation();
    DocumentBuilderFactory builderFact = DocumentBuilderFactory.newInstance();
    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;
    try
    {
      serial = new XMLSerializer(new FileOutputStream("domcreate.xml"), 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包,这里使用jdom1.0.jar。(见附件)
JDOMConvert.java

Java代码 
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 JDOMConvert  
{  
    public 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();  
      //root.removeChild("db");//删除节点  
      root.addContent(eltDb);//增加节点  
        
      //修改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();  
        }  
    }  


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 JDOMConvert
{
    public 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();
      //root.removeChild("db");//删除节点
      root.addContent(eltDb);//增加节点
     
      //修改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.java 

Java代码 
import java.io.IOException;  
 
import org.jdom.Document;  
import org.jdom.Element;  
import org.jdom.output.XMLOutputter;  
 
public class JDOMCreate  
{  
  public static void main(String[] args)  
  {  
    Document doc = new Document(new Element("games"));  
    Element newGame = new Element("game").setText("Final Fantasy VI");  
    doc.getRootElement().addContent(newGame);  
    newGame.setAttribute("genre", "rpg");  
    XMLOutputter domstream = new XMLOutputter();  
    try 
    {  
      domstream.output(doc, System.out);  
    } catch (IOException e)  
    {  
      e.printStackTrace();  
    }  
  }  


import java.io.IOException;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;

public class JDOMCreate
{
  public static void main(String[] args)
  {
    Document doc = new Document(new Element("games"));
    Element newGame = new Element("game").setText("Final Fantasy VI");
    doc.getRootElement().addContent(newGame);
    newGame.setAttribute("genre", "rpg");
    XMLOutputter domstream = new XMLOutputter();
    try
    {
      domstream.output(doc, System.out);
    } catch (IOException e)
    {
      e.printStackTrace();
    }
  }
}第四种:DOM4J解析
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解析器,也没有通过系统属性org.xml.sax.driver设置解析器,dom3j将会使用JAXP来加载JAXP配置的解析器,如果创建解析器失败,那么最后才使用dom4j自带的Aelfred2解析器。
同样,首先要在工程中添加dom4j的jar包,这里使用dom4j-1.6.1.jar。(见附件)
Dom4j生成XML文档db.xml:Dom4jCreate.java

Java代码 
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 Dom4jCreate  
{  
 
  public 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();  
    }  
  }  


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 Dom4jCreate
{

  public 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.java

Java代码 
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 Dom4jModify  
{  
  public Document modifyDocument(File inputXml)  
  {  
    try 
    {  
      SAXReader 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://localhost/mySql");  
      element.element("db").element("driver").setText("com.mysql.jdbc.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-modified.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 Exception  
  {  
    Dom4jModify dom4jParser = new Dom4jModify();  
    Document document = dom4jParser.modifyDocument(new File("domdb.xml"));  
      
    OutputFormat outFmt = new OutputFormat("    ", true);  
    outFmt.setEncoding("UTF-8");  
    XMLWriter xmlWriter = new XMLWriter(System.out,outFmt);  
    xmlWriter.write(document);  
    xmlWriter.flush();  
    xmlWriter.close();  
  }  

分享到:
评论

相关推荐

    xml的四种解析方法及源代码.pdf

    在Java中,处理XML文档通常有四种主要的解析方法:DOM(文档对象模型)、SAX(简单API对于XML)、JDOM(Java特定的DOM)以及DOM4J。每种解析方法都有自己的特点和适用场景,下面将详细介绍这些解析方法以及提供的...

    XML的四种解析方式比较

    在Java中,处理XML有四种主要的解析方式:DOM、SAX、DOM4J和JDOM。每种方法都有其特性和适用场景,下面将详细对比和介绍这四种解析方式。 1. DOM(Document Object Model) DOM是一种树形结构的API,它将整个XML...

    dom4j---xml解析jar包

    在Java环境中,解析XML文档时,我们通常会遇到各种库,其中DOM4J是一个非常流行的、功能强大的开放源代码库。这个库不仅简化了XML处理,还提供了XPath和XSLT的支持,使其成为Java开发者处理XML的首选工具之一。 **...

    dom4j-1.6.1-API+源代码-中文版.rar

    **DOM4J 1.6.1 API及源代码中文版详解** DOM4J是一个非常优秀的Java XML API,它提供了全面而强大的XML处理功能,包括读取、创建、修改和查询XML文档。这个压缩包“dom4j-1.6.1-API+源代码-中文版.rar”包含了DOM4J...

    dom4j源代码

    2. **SAX支持**:DOM4J也支持SAX(Simple API for XML),这是一种事件驱动的解析器,适用于处理大型XML文件,因为它不需要将整个文档加载到内存中。 3. **XPath支持**:DOM4J提供了对XPath的支持,XPath是一种在...

    xml四种解析.rar

    本资源“xml四种解析.rar”聚焦于XML的四种主要解析方法,其中包括DOM、SAX、StAX以及DOM4J和JDOM这两个Java库的使用。 1. DOM(Document Object Model)解析: DOM是W3C推荐的标准解析模型,它将整个XML文档加载到...

    dom4j和jdom解析XML小例子

    本文将深入探讨如何使用dom4j和jdom两种流行的Java库来解析XML文档,并通过具体的代码示例来展示它们的应用。 ### DOM4J DOM4J(Document Object Model for Java)是一个开放源代码的Java API,用于处理XML文档。...

    dom4j jdom api jar

    DOM4J和JDOM是两种流行的Java XML处理库,它们为开发者提供了API来解析、创建、操作和遍历XML文档。这两个库都是基于Java的,旨在简化XML文档对象模型(DOM)的使用,同时提供更高效和灵活的处理方式。 **DOM4J** ...

    java xml 解析 源代码

    在源代码中,你可以找到使用DOM和SAX解析XML的示例。通过阅读和运行这些代码,你将更好地理解它们的工作原理和使用场景。记得在实际操作时,确保XML文件的编码正确,并处理可能的异常情况,如文件不存在或格式错误。...

    jdom.jar与dom4j.jar包

    DOM4J是一个功能丰富的XML处理库,它不仅实现了DOM API,还提供了SAX和StAX的集成。DOM4J的API设计更加简洁,易于理解和使用,特别是对于XPath表达式的支持,使得开发者可以方便地定位和操作XML文档的任何部分。 - ...

    Dom4j_demo.rar_DEMO_dom4j de_dom4j demo_dom4j demo project_xml读

    此外,Dom4j还支持SAX和DOM解析器,以及JAXB和JDOM的接口,使其能够与多种XML处理技术兼容。 **XML读取操作** 在Java中使用Dom4j进行XML读取通常包括以下步骤: 1. 加载XML文档:通过`DocumentFactory`创建`...

    jdom.jar xml解析

    4. **Builder**:用于创建和解析XML文档的类,如`SAXBuilder`用于从XML源生成DOM结构,`DocumentBuilder`用于构建XML文档。 5. **BasicJDOMFactory**:提供默认的元素和属性创建方法。 **使用JDOM解析XML的步骤** ...

    xml四种解析方法,解析XML四种方法

    JDOM直接从XML源生成一个树模型,然后可以直接操作这个模型。 代码示例: ```java import org.jdom2.Document; import org.jdom2.input.SAXBuilder; import org.jdom2.output.Format; import org.jdom2.output....

    jdom4j解析xml

    与标准的DOM和SAX相比,jdom4j提供了更高级别的抽象,使得开发者可以更加专注于业务逻辑而不是底层的XML处理细节。此外,jdom4j还支持XPath查询,使得查找和操作XML文档中的特定元素变得非常容易。 ### 总结 通过...

    dom4j-2.1.1 jar和source.jar

    1. **XML解析**:DOM4J可以使用DOM、SAX或StAX解析器读取XML文档,并提供了一种统一的API来处理不同解析器产生的事件。 2. **文档对象模型(DOM)**:DOM4J提供了类似于W3C DOM的接口,但比DOM更轻量级,性能更好。 ...

    jdom文件解析源代码

    在本文中,我们将深入探讨JDOM的基本概念、如何读取和写入XML文件,并通过源代码分析来理解其工作原理。 1. JDOM基本概念: - DOM(Document Object Model)是W3C制定的一种标准,它定义了XML文档的结构和操作方法...

    dom4j-2.1.0

    综上所述,dom4j-2.1.0是一个强大的XML处理库,提供了丰富的功能,包括解析、构建、查询、转换XML文档,并且提供了源代码和文档供开发者使用。在Java项目中,通过导入对应的JAR文件,可以方便地集成并利用dom4j进行...

    Jdom解析XML

    通过JDOM,开发者可以使用Java API来处理XML文档,无需了解底层的SAX或DOM解析器的工作原理。 **JDOM的基本元素** - **Document**: XML文档的根节点,代表整个XML文档。 - **Element**: 表示XML文档中的元素,它是...

    jdom的源代码文档

    首先,我们要明白JDOM的核心理念是建立一个完全用Java实现的DOM(Document Object Model)接口,避免了使用其他跨平台的XML解析库如DOM4J或Xerces时可能遇到的平台依赖性问题。JDOM的设计目标是简单、高效和直接,...

    dom4j的源文件(dom4j-1.6.1)含例子和jar包

    - **解析和生成 XML**: DOM4J 可以解析 XML 文件,创建 `Document` 对象,也可以将 `Document` 转换回 XML 字符串。 - **操作 XML 结构**: 添加、删除、修改元素、属性等。 - **事件处理**: 提供了基于 SAX 的...

Global site tag (gtag.js) - Google Analytics