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

    1、Jdom解析

      (1)读取XML内容

  

   private static void readXML() {
// TODO Auto-generated method stub
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
Document document = JdomTools.getDocument("src/books.xml");
// 找节点
NodeList tagName = document.getElementsByTagName("name");
Node item = tagName.item(1);
// 获取节点文本
String textContent = item.getTextContent();
System.out.println(textContent);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

    (2)写入新节点

  

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

  (3)移除子节点

  public static void removeNode(){
try {
Document document = JdomTools.getDocument("src/books.xml");
///方法一
//Node node = document.getElementsByTagName("nums").item(0); //System.out.println(node.getParentNode().getTextContent());
//node.getParentNode().removeChild(node);
///方法二 JdomTools.deleteNode(document.getElementsByTagName("book").item(0),document.getElementsByTagName("nums").item(0));
JdomTools.write2Xml(document, "src/books.xml");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

  (4)替换子节点

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

  JdomTools工具类

 package com.xujingyang.utils;

 import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult; import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Node; public class JdomTools { /**
* 查找document
* @param path
* @return
* @throws Exception
*/
public static Document getDocument(String path) throws Exception{
// 获取DocumentBuilder实例
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
// 获取document对象
return builder.parse(path);
} /**
* 删除节点
* @param path
* @param oldChild
* @param document
* @throws Exception
*/
public static void deleteNode(Node document,Node oldChild ) throws Exception{
//移除document节点下的子节点
document.removeChild(oldChild);
} /**
* 替换子节点
* @param document
* @param newChild
* @param oldChild
*/
public static void replaceNodeText(Node newChild,Node oldChild){
//oldChild替换替换为新的newChild节点
oldChild.getParentNode().replaceChild(newChild, oldChild);
}
/**
* 写入新节点
* @param document
* @param path
* @throws Exception
*/
public static void write2Xml(Document document,String path) throws Exception{
//获取Transformer对象
Transformer transformer = TransformerFactory.newInstance().newTransformer();
//把写好的新的document树中写入新的文件(一般是覆盖原文件)
transformer.transform(new DOMSource(document), new StreamResult(path));
}
}

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)普通的解析方式

 package com.xujingyang.utils;

 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 saxDom {
public static void getDom(String XMLpath) throws Exception{
SAXParserFactory parserFactory = SAXParserFactory.newInstance();
SAXParser saxParser = parserFactory.newSAXParser();
saxParser.parse(XMLpath, new DefaultHandler(){
protected String result="";
@Override
public void startDocument() throws SAXException {
//开始解析文档
super.startDocument();
result+="document begin\r\n";
} @Override
public void startElement(String uri, String localName,
String qName, Attributes attributes) throws SAXException {
//开始解析节点
super.startElement(uri, localName, qName, attributes);
result+="\r\nelement begin";
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
//开始读取节点内容
super.characters(ch, start, length);
result+=String.copyValueOf(ch, start, length);
} @Override
public void endDocument() throws SAXException {
//结束解析文档
super.endDocument();
result+="\r\ndocument end";
System.out.println(result);
} @Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
//结束解析节点
super.endElement(uri, localName, qName);
result+="\r\nelement end";
}
});
} }

  (2)封装JavaBean的解析方式

  

 package com.xujingyang.utils;

 import java.util.ArrayList;

 import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler; import com.xujingyang.domain.Book; public class sax4bean {
public static ArrayList<Book> getBooks() throws Exception{
//对象集合
final ArrayList<Book> books=new ArrayList<Book>();
SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
XMLReader reader = saxParser.getXMLReader();
reader.setContentHandler(new DefaultHandler(){
Book book=null;
String nodeString;//做判断是否节点是要找的属性节点 @Override
public void startElement(String uri, String localName,
String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
//判断节点名称是要找的对象就初始化bean
if("book".equals(qName)){
book=new Book();
}
nodeString=qName; }
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
if(book!=null){
String textString=new String(ch, start, length);
if("name".equals(nodeString)){
book.setName(textString);
}else if ("aothour".equals(nodeString)) {
book.setAothour(textString);
}else if ("price".equals(nodeString)) {
book.setPrice(Float.parseFloat(textString));
}
}
} @Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
//每次节点解析结束就要判断是否是一个对象结束,如果结束就将对象置空
if("book".equals(qName)){
books.add(book);
book=null;
}
//每次节点名称都要置空,否则就会读到空文本
nodeString=null;
}
});
reader.parse("src/books.xml"); return books;
}
}

  对象类

 package com.xujingyang.domain;

 public class Book {
private String name;
private String aothour;
private float price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAothour() {
return aothour;
}
public void setAothour(String aothour) {
this.aothour = aothour;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
@Override
public String toString() {
return "Book [name=" + name + ", aothour=" + aothour + ", price="
+ price + "]";
} }

要解析的XML文档

 <?xml version="1.0" encoding="UTF-8" standalone="no"?><books>
<book>
<name>三国演义</name>
<aothour>罗贯中</aothour>
<price>22</price> </book>
<book>
<name>西游记</name>
<aothour>吴承恩</aothour>
<price>24</price>
</book>
</books>

Java解析XML:Jdom解析和SAX解析的更多相关文章

  1. Java高级特性 第14节 解析XML文档(2) - SAX 技术

    一.SAX解析XML文档 SAX的全称是Simple APIs for XML,也即XML简单应用程序接口.与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式.当使用S ...

  2. javaweb学习总结十二(JAXP对XML文档进行SAX解析)

    一:JAXP使用SAX方式解析XML文件 1:dom解析与sax解析异同点 2:sax解析特点 二:代码案例 1:xml文件 <?xml version="1.0" enco ...

  3. 2.2 使用 JAXP 对XML文档进行SAX解析

    使用JAXP 对 XML文档进行 SAX解析: public class Demo1 { /** * 使用JAXP对XML文档进行SAX解析 * @throws Exception * @throws ...

  4. Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)

    [目录] 一.[基础知识——扫盲] 二.[DOM.SAX.JDOM.DOM4j简单使用介绍] 三.[性能测试] 四.[对比] 五.[小插曲XPath] 六.[补充] 关键字:Java解析xml.解析x ...

  5. java解析xml的方式DOM,SAX,DOM4J,JDOM,StAX

    1)DOM(JAXP Crimson解析器)DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找 特定信息. ...

  6. Android笔记(四十七) Android中的数据存储——XML(三)SAX解析

    SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备. SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SA ...

  7. iOS开发中XML的DOM和SAX解析方法

    一.介绍 dom是w3c指定的一套规范标准,核心是按树形结构处理数据,dom解析器读入xml文件并在内存中建立一个结构一模一样的“树”,这树各节点和xml各标记对应,通过操纵此“树”来处理xml中的文 ...

  8. java解析xml字符串为实体(dom4j解析)

    package com.smsServer.Dhst; import java.util.HashMap; import java.util.Iterator; import java.util.Ma ...

  9. 解析XML文件之使用SAM解析器

    XML是一种常见的传输数据方式,所以在开发中,我们会遇到对XML文件进行解析的时候,本篇主要介绍使用SAM解析器,对XML文件进行解析. SAX解析器的长处是显而易见的.那就是SAX并不须要将全部的文 ...

随机推荐

  1. php基本语法与函数

    1.标记与注释 <?php 代码 ?> 用/*  */注释一段代码,  用 // 注释一行代码   /**    */文档注释 注意:若php下面只有php代码没有别的代码,那么最好不要加 ...

  2. 【LeetCode】【数组归并】Merge k Sorted Lists

    描述 Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity ...

  3. zookeeper 实战案例分享:cruator客户端编程

    上两篇介绍了zookeeper服务器端的安装和配置,今天分享下利用zookeeper客户端编程来实现配置文件的统一管理,包括文件添加.删除.更新的同步. 比如,连接数据库信息的配置文件,一般每个应用服 ...

  4. 让IE6支持max_height、max_width等等

    推荐使用min-height:500px;_height:500px;来解决IE6不能max和min属性的问题.

  5. linux限制用户内存使用

    最近有内存使用报警的邮件发出,之后杀掉了内存占用高的进程,使内存恢复正常 但是发现某些程序被杀掉了,有过怀疑是被人手动杀掉的,看日志后发现应该是内存占用过大,系统自动杀掉的 内存耗尽会调用oom 对进 ...

  6. UNIGUI:How to redirect and close session?

    Hello, i would have 2 unigui app. the first app is a simple authentification app and second will be ...

  7. 算法(Algorithms)第4版 练习 2.2.5

    top-down: M E R G E S O R T E X A M P L E M E R G E S O R T E X A M P L E E X A M P L E merge(input, ...

  8. Luogu P1377 [TJOI2011]树的序:离线nlogn建二叉搜索树

    题目链接:https://www.luogu.org/problemnew/show/P1377 题意: 有一棵n个节点的二叉搜索树. 给出它的插入序列,是一个1到n的排列. 问你使得树的形态相同的字 ...

  9. Delphi TcxComboBox控件说明

    属性: Text:ComboBox 的文本信息 EditText: 也是给ComboBox 的文本信息赋值,但不同的是 给Text赋值会 触发 Change事件,也会触发 EditvaluesChan ...

  10. c语言代码风格2

    1.注释 注释的目的是为了说明做了什么,而不是怎么做,所以注释表达应该准确而又简洁.注释要放在被注释内容的上方或右方.注释一般采用/*.........*/或//........ 对代码源文件和函数应 ...