java用SAX递归获取XML中的数据

原创 2015年07月06日 16:22:46

java中解析XML的方法有很多种,今天学了下用SAX来解析xml。

所需jar包:jdom.jar

xml:

<xml id='id'>
    <ToUserName>toUser</ToUserName>
    <FromUserName>fromUser</FromUserName>
    <CreateTime>12345678</CreateTime>
    "
    + "
    <MsgType>image</MsgType>
    <Image>
        <MediaId>media_id</MediaId>
    </Image>
</xml>


解析xml的java代码:

package com.linb.xml;

import java.io.IOException;
import java.io.StringReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

public class XmlTest {
    public static void main(String[] args) {
        run();
    }

    public static void run() {
        // xml字符串
        String xmlString = "<xml id='id'><ToUserName>toUser</ToUserName><FromUserName>fromUser</FromUserName><CreateTime>12345678</CreateTime>"
                + "<MsgType>image</MsgType><Image><MediaId>media_id</MediaId></Image></xml>";
        // 创建SAXBuilder
        SAXBuilder saxBuilder = new SAXBuilder();
        // 保存xml数据到map
        Map<String, String> map = new HashMap<String, String>();
        try {
            // 通过xml字符串创建Document
            Document doc = saxBuilder.build(new StringReader(xmlString));
            // 根元素
            Element root = doc.getRootElement();
            map.put("root.name", root.getName());
            // 递归获取xml的数据
            dfs(root, map, root.getName());
        } catch(JDOMException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch(IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //遍历map输出数据
        for(Map.Entry<String, String>entry:map.entrySet()){
            System.out.println(entry.getKey()+":"+entry.getValue());
        }
    }

    public static void dfs(Element e, Map<String, String> map, String fatherName) {
        // 获取节点e的所有属性
        if(e.getAttributes().size() > 0) {
            Iterator<Attribute> it = e.getAttributes().iterator();
            while(it.hasNext()) {
                Attribute attribute = it.next();
                String name = attribute.getName();
                String value = e.getAttributeValue(name);
                map.put(fatherName + "->" + name, value);
            }
        }
        List children = e.getChildren();
        Iterator<Element> it = children.iterator();
        while(it.hasNext()) {
            Element child = it.next();
            String name = fatherName + "." + child.getName();
            // 如果有子节点就递归
            if(child.getChildren().size() > 0) {
                dfs(child, map, name);
            } else {
                // 没有子节点,获取节点的文本
                map.put(name, child.getText());
                // 获取这个节点的属性值
                if(child.getAttributes().size() > 0) {
                    Iterator<Attribute> childIt = child.getAttributes()
                            .iterator();
                    while(childIt.hasNext()) {
                        Attribute attribute = childIt.next();
                        String attrName = attribute.getName();
                        String attrValue = child
                                .getAttributeValue(attrName);
                        map.put(name + "->" + attrName, attrValue);
                    }
                }
            }
        }
    }
}


通过Sax方式解析xml文件

说明:此案例使用的是通过Dom方式解析xml文件这篇文章里的City类和china.xml文件。 1. 因为xml文件有两种格式,一是上面那篇文章里的那种元素节点里只包含属性节点,另一种就是元素节点...
  • lyy1104
  • lyy1104
  • 2014年06月04日 20:54
  • 920

Dom4j解析xml文件-递归遍历所有节点和属性

引言        Dom4j是java中常用读取xml文件的工具,就方便性和性能方面,一定程度要优于JDK中Domcument和SAX解析的,感兴趣的童鞋可以看看这篇文章 java解析XML的四种方...
  • chenleixing
  • chenleixing
  • 2015年03月17日 22:00
  • 55693

递归遍历所有xml的节点及子节点

遍历所有xml的节点及子节点,dom4j package test.floatd; import java.io.File; import java.util.List; import org....
  • sidihuo
  • sidihuo
  • 2015年08月06日 16:22
  • 14228

java中用SAX解析XML

原文地址:http://www.cnblogs.com/allenzheng/archive/2012/12/01/2797196.html 注:考虑到自己程序中表结构比较大,有几百个字段,再加...
  • w2393040183
  • w2393040183
  • 2016年07月15日 11:11
  • 1653

sax解析 得到xml文档所有内容和获取指定标签的值

//得到xml文档所有内容 package cn.itcast.sax; import java.io.IOException; import javax.xml.parsers.ParserC...
  • xgcfxl2011
  • xgcfxl2011
  • 2013年01月23日 21:55
  • 7755

Java解析xml文档之SAX解析

sax解析是一种边读边解析,仅向前读取,不能修改,用来读。sax创建XMLReader三步:SAXParserFactory factory = SAXParserFactory.newInstanc...
  • new___Smile
  • new___Smile
  • 2016年07月16日 00:59
  • 3512

使用SAX解析将xml的文件内容结构保存到java对象中

在Java使用Sax解析xml文件中,我们介绍了如何用SAX解析xml文件,接下来我们继续学习如何将一个xml文件的内容结构保存到一个java实例对象中 一、xml文件如下 计...
  • kingsonyoung
  • kingsonyoung
  • 2016年07月22日 15:17
  • 1432

java中使用sax解析xml,以实体类集合的方式接受xml解析的值

1.先编写要解析的xml文件: Allen 男 20 namy 女 18 lufy 男 19 2.编写要转换的实体类:PersonBean package com.xml.uti...
  • w2393040183
  • w2393040183
  • 2016年07月18日 11:09
  • 1663

java--通过sax方式解析xml文件的简单实例

1.重写的继承自DefaultHandler的方法,部分代码如下: @Override public void startElement(String uri, String localName,...
  • a1491758730
  • a1491758730
  • 2015年10月18日 09:36
  • 763

简单使用SAXReader解析xml数据

之前的工作中,一直是使用json格式的数据进行数据传输。很少会接触到xml格式的数据。不过因为工作需求,在对接其他产品的接口时,偶尔会遇到需要使用xml格式数据的情况,所以,也得学学如何解析xml。不...
  • u011291072
  • u011291072
  • 2016年12月06日 20:13
  • 7840
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java用SAX递归获取XML中的数据
举报原因:
原因补充:

(最多只允许输入30个字)