zoukankan      html  css  js  c++  java
  • Java解析XML:Jdom解析和SAX解析

    今天看了Java解析XML的几种方法,记录一下

        1、Jdom解析

          (1)读取XML内容

      

     1   private static void readXML() {
     2         // TODO Auto-generated method stub
     3         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
     4         try {
     5             Document document = JdomTools.getDocument("src/books.xml");
     6             // 找节点
     7             NodeList tagName = document.getElementsByTagName("name");
     8             Node item = tagName.item(1);
     9             // 获取节点文本
    10             String textContent = item.getTextContent();
    11             System.out.println(textContent);
    12         } catch (Exception e) {
    13             // TODO Auto-generated catch block
    14             e.printStackTrace();
    15         }
    16     }

        (2)写入新节点

      

     1   public static void write2XML() {
     2         try {
     3             
     4             //获取要写入新节点的原dom树信息
     5             Document document = JdomTools.getDocument("src/books.xml");
     6             NodeList nodeList = document.getElementsByTagName("book");
     7             Node node = nodeList.item(0);
     8             //实例化一个新的节点对象
     9             Element element = document.createElement("nums");
    10             element.setTextContent("132");
    11             //追加到父节点中
    12             node.appendChild(element);
    13             //将修改后的新的dom覆盖掉原来的dom文件
    14             JdomTools.write2Xml(document, "src/books.xml");
    15         } catch (Exception e) {
    16             // TODO Auto-generated catch block
    17             e.printStackTrace();
    18         }
    19     }

      (3)移除子节点

     1  public static void removeNode(){
     2         try {
     3             Document document = JdomTools.getDocument("src/books.xml");
     4     ///方法一
     5             //Node node = document.getElementsByTagName("nums").item(0);
     6             
     7             //System.out.println(node.getParentNode().getTextContent());
     8             //node.getParentNode().removeChild(node);
     9     ///方法二
    10             
    11             JdomTools.deleteNode(document.getElementsByTagName("book").item(0),document.getElementsByTagName("nums").item(0));
    12             JdomTools.write2Xml(document, "src/books.xml");
    13         } catch (Exception e) {
    14             // TODO Auto-generated catch block
    15             e.printStackTrace();
    16         }
    17     }

      (4)替换子节点

     1  public static void replaceNode(){
     2         try {
     3             Document document = JdomTools.getDocument("src/books.xml");
     4             Element element = document.createElement("添加的");
     5             element.setTextContent("这是测试的内容");
     6             JdomTools.replaceNodeText(element, document.getElementsByTagName("price").item(0));
     7             JdomTools.write2Xml(document, "src/books.xml");
     8         } catch (Exception e) {
     9             // TODO Auto-generated catch block
    10             e.printStackTrace();
    11         }
    12     }

      JdomTools工具类

     1 package com.xujingyang.utils;
     2 
     3 import javax.xml.parsers.DocumentBuilder;
     4 import javax.xml.parsers.DocumentBuilderFactory;
     5 import javax.xml.transform.Transformer;
     6 import javax.xml.transform.TransformerFactory;
     7 import javax.xml.transform.dom.DOMSource;
     8 import javax.xml.transform.stream.StreamResult;
     9 
    10 import org.w3c.dom.DOMException;
    11 import org.w3c.dom.Document;
    12 import org.w3c.dom.Node;
    13 
    14 public class JdomTools {
    15     
    16     /**
    17      * 查找document
    18      * @param path
    19      * @return
    20      * @throws Exception 
    21      */
    22     public  static Document getDocument(String path) throws Exception{
    23         // 获取DocumentBuilder实例
    24         DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    25         // 获取document对象
    26         return builder.parse(path);
    27     }
    28 
    29     
    30     /**
    31      * 删除节点
    32      * @param path
    33      * @param oldChild
    34      * @param document 
    35      * @throws Exception
    36      */
    37     public static void deleteNode(Node document,Node oldChild ) throws Exception{
    38         //移除document节点下的子节点
    39         document.removeChild(oldChild);
    40     }
    41     
    42     /**
    43      * 替换子节点
    44      * @param document
    45      * @param newChild
    46      * @param oldChild
    47      */
    48     public static void replaceNodeText(Node newChild,Node oldChild){
    49         //oldChild替换替换为新的newChild节点
    50         oldChild.getParentNode().replaceChild(newChild, oldChild);
    51     }
    52     /**
    53      * 写入新节点
    54      * @param document
    55      * @param path
    56      * @throws Exception
    57      */
    58     public static void write2Xml(Document document,String path) throws Exception{
    59         //获取Transformer对象
    60         Transformer transformer = TransformerFactory.newInstance().newTransformer();
    61         //把写好的新的document树中写入新的文件(一般是覆盖原文件)
    62         transformer.transform(new DOMSource(document), new StreamResult(path));
    63     }
    64 }

    2、SAX解析

        SAX
          Simple API for XML
        开发包
          JAXP:是SUN公司推出的解析标准实现
          java API for xml Processing
        主要包含的类和接口
          org.w3c.dom:提供DOM方式解析XML的标准接口
          org.xml.sax:提供SAX方式解析XML的标准接口
          javax.xml:提供了解析XML文档的类

      (1)普通的解析方式

     1 package com.xujingyang.utils;
     2 
     3 
     4 import javax.xml.parsers.SAXParser;
     5 import javax.xml.parsers.SAXParserFactory;
     6 
     7 import org.xml.sax.Attributes;
     8 import org.xml.sax.SAXException;
     9 import org.xml.sax.helpers.DefaultHandler;
    10 
    11 public class saxDom {
    12     public static void getDom(String XMLpath) throws Exception{
    13         SAXParserFactory parserFactory = SAXParserFactory.newInstance();
    14         SAXParser saxParser = parserFactory.newSAXParser();
    15         saxParser.parse(XMLpath, new DefaultHandler(){
    16             protected String result="";
    17             @Override 
    18             public void startDocument() throws SAXException {
    19                 //开始解析文档
    20                 super.startDocument();
    21                 result+="document begin
    ";
    22             }
    23 
    24             @Override
    25             public void startElement(String uri, String localName,
    26                     String qName, Attributes attributes) throws SAXException {
    27                 //开始解析节点
    28                 super.startElement(uri, localName, qName, attributes);
    29                 result+="
    element begin";
    30             }
    31             @Override
    32             public void characters(char[] ch, int start, int length)
    33                     throws SAXException {
    34                 //开始读取节点内容
    35                 super.characters(ch, start, length);
    36                 result+=String.copyValueOf(ch, start, length);
    37             }
    38 
    39             @Override
    40             public void endDocument() throws SAXException {
    41                 //结束解析文档
    42                 super.endDocument();
    43                 result+="
    document end";
    44                 System.out.println(result);
    45             }
    46 
    47             @Override
    48             public void endElement(String uri, String localName, String qName)
    49                     throws SAXException {
    50                 //结束解析节点
    51                 super.endElement(uri, localName, qName);
    52                 result+="
    element end";
    53             }
    54         });
    55     }
    56     
    57 }

      (2)封装JavaBean的解析方式

      

     1 package com.xujingyang.utils;
     2 
     3 
     4 import java.util.ArrayList;
     5 
     6 import javax.xml.parsers.SAXParser;
     7 import javax.xml.parsers.SAXParserFactory;
     8 
     9 import org.xml.sax.Attributes;
    10 import org.xml.sax.SAXException;
    11 import org.xml.sax.XMLReader;
    12 import org.xml.sax.helpers.DefaultHandler;
    13 
    14 import com.xujingyang.domain.Book;
    15 
    16 public class sax4bean {
    17     public static ArrayList<Book> getBooks() throws Exception{
    18         //对象集合
    19         final ArrayList<Book> books=new ArrayList<Book>();
    20         SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
    21         XMLReader reader = saxParser.getXMLReader();
    22         reader.setContentHandler(new DefaultHandler(){
    23             Book book=null;
    24             String nodeString;//做判断是否节点是要找的属性节点
    25 
    26             @Override
    27             public void startElement(String uri, String localName,
    28                     String qName, Attributes attributes) throws SAXException {
    29                 super.startElement(uri, localName, qName, attributes);
    30                 //判断节点名称是要找的对象就初始化bean
    31                 if("book".equals(qName)){
    32                     book=new Book();
    33                 }
    34                 nodeString=qName;
    35                 
    36             }
    37             @Override
    38             public void characters(char[] ch, int start, int length)
    39                     throws SAXException {
    40                 super.characters(ch, start, length);
    41                 if(book!=null){
    42                     String textString=new String(ch, start, length);
    43                     if("name".equals(nodeString)){
    44                         book.setName(textString);
    45                     }else if ("aothour".equals(nodeString)) {
    46                         book.setAothour(textString);
    47                     }else if ("price".equals(nodeString)) {
    48                         book.setPrice(Float.parseFloat(textString));
    49                     }
    50                 }
    51             }
    52 
    53 
    54             @Override
    55             public void endElement(String uri, String localName, String qName)
    56                     throws SAXException {
    57                 // TODO Auto-generated method stub
    58                 super.endElement(uri, localName, qName);
    59                 //每次节点解析结束就要判断是否是一个对象结束,如果结束就将对象置空
    60                 if("book".equals(qName)){
    61                     books.add(book);
    62                     book=null;
    63                 }
    64                 //每次节点名称都要置空,否则就会读到空文本
    65                 nodeString=null;
    66             }
    67         });
    68         reader.parse("src/books.xml");
    69         
    70         return books;
    71     }
    72 }

      对象类

     1 package com.xujingyang.domain;
     2 
     3 public class Book {
     4     private String name;
     5     private String aothour;
     6     private float price;
     7     public String getName() {
     8         return name;
     9     }
    10     public void setName(String name) {
    11         this.name = name;
    12     }
    13     public String getAothour() {
    14         return aothour;
    15     }
    16     public void setAothour(String aothour) {
    17         this.aothour = aothour;
    18     }
    19     public float getPrice() {
    20         return price;
    21     }
    22     public void setPrice(float price) {
    23         this.price = price;
    24     }
    25     @Override
    26     public String toString() {
    27         return "Book [name=" + name + ", aothour=" + aothour + ", price="
    28                 + price + "]";
    29     }
    30     
    31 }

    要解析的XML文档

     1 <?xml version="1.0" encoding="UTF-8" standalone="no"?><books>
     2     <book>
     3         <name>三国演义</name>
     4         <aothour>罗贯中</aothour>
     5         <price>22</price>
     6         
     7     </book>
     8     <book>
     9         <name>西游记</name>
    10         <aothour>吴承恩</aothour>
    11         <price>24</price>
    12     </book>
    13 </books>
  • 相关阅读:
    mysql初始化/usr/local/mysql/bin/mysqld: error while loading shared libraries: libnuma.so.1: cannot open shared object file: No such file or directory
    centos重启出现type Control-D to continue【fsck使用】
    find 常用命令
    保持简单----纪念丹尼斯•里奇(Dennis Ritchie)
    最有效的五个方法,彻底控制你的负面情绪,你有吗
    ERROR 1366 (HY000): Incorrect string value: 'xE9x83x91xE5xB7x9E' for column 'aa' at row 1 MySQL 字符集
    Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
    mysql从5.6升级到5.7后出现 Expression #1 of ORDER BY clause is not in SELECT list,this is incompatible with DISTINCT
    mysqld_safe error: log-error set to '/data/log/mysqld.log', however file don't exists. Create writable for user 'mysql'.The server quit without updating PID file (/data/mysql/mysqld.pid)
    ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
  • 原文地址:https://www.cnblogs.com/xujingyang/p/6421135.html
Copyright © 2011-2022 走看看