文档章节

JavaParseXml

Lechance
 Lechance
发布于 2014/08/27 23:53
字数 349
阅读 15
收藏 0
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;



public class T4 {
    
    
    static class Node{
        
        String nodename;//标签名
        
        Map<String, String> attributes;//属性
        
        String text;//文本
        
        List<Node> childers;//子元素
        
        
        @Override
        public String toString() {
            // TODO Auto-generated method stub
            
            StringBuilder builder=new StringBuilder();
            
            builder.append("tagname:"+this.nodename);
            
            Iterator<String> iterator=attributes.keySet().iterator();
            
            builder.append(",attribute:[");
            while(iterator.hasNext()){
                
                String key=iterator.next();
                builder.append(key+"="+attributes.get(key)+",");
            }
            builder.append("],");
            builder.append("children:[");
            for(Node node:childers){
                builder.append(node.nodename+",");
            }
            builder.append("]");
            
            return builder.toString().replaceAll(",]", "]");
        }
    }

    public static void main(String[] args) throws IOException {
        
    
        
        String xml="<xml a=b c=d e=5>testxml" +
                "<a>testa</a>" +
                 "<b>testb</b>"+
                "</xml>";
        
        Pattern pattern_kt=Pattern.compile("^<(\\w+)[^<]*>([^<]*)");//匹配开头
        Pattern  pattern_attr=Pattern.compile("(\\w+)=(\\w+)");//匹配属性
        Pattern pattern_jw=Pattern.compile("^</(\\w+)>");//匹配结尾
        
        Pattern pattern=Pattern.compile("<(\\w+)[^<]*>([^<]*)|</(\\w+)>");//匹配下一个(可能是开始也可以是结尾)
        
        Stack<Node> nodes=new Stack<Node>(); //元素栈
        
        List<Node> list_nodes=new ArrayList<Node>();//真正的符合规范的元素集合
        
        Matcher matcher=pattern.matcher(xml);
        
        while(matcher.find()){
                
            String tmp=matcher.group();
            Matcher matcher2=pattern_kt.matcher(tmp);//匹配开头
            
            Matcher matcher3=pattern_jw.matcher(tmp);//匹配结尾
            //如果是开头就找到元素的 标签名称 和元素的属性 还有元素的文本
            if(matcher2.find()){
                
                Node node=new Node();
                //父节点
                if(!nodes.isEmpty()){
                    nodes.peek().childers.add(node);
                }
                nodes.push(node);
                node.attributes=new HashMap<String, String>();
                node.childers=new ArrayList<T4.Node>();
                
                node.nodename=matcher2.group(1);//标签名称
                
                Matcher  attrs=pattern_attr.matcher(tmp);
                
                
                //属性
                while(attrs.find()){
                    
                   node.attributes.put(attrs.group(1),attrs.group(2));
                    
                }
                //文本
                if(matcher2.group(2)!=null){
                    node.text=matcher2.group(2);
                }

                //如果是结尾 就弹出栈,弹出的如果和当前的标签名称一样 才加入集合
            }else if(matcher3.find()){            
                Node node=nodes.pop();
                if(node.nodename.equals(matcher3.group(1))){
                    list_nodes.add(node);
                }
                
            }
            
        }
        
        for(Node node:list_nodes){
            
         System.out.println(node);
        }
    
    }
}


© 著作权归作者所有

下一篇: MD5算法原理
Lechance
粉丝 2
博文 30
码字总数 1832
作品 0
静安
程序员
私信 提问

暂无文章

PostgreSQL 11.3 locking

rudi
今天
5
0
Mybatis Plus sql注入器

一、继承AbstractMethod /** * @author beth * @data 2019-10-23 20:39 */public class DeleteAllMethod extends AbstractMethod { @Override public MappedStatement injectMap......

一个yuanbeth
今天
10
1
一次写shell脚本的经历记录——特殊字符惹的祸

本文首发于微信公众号“我的小碗汤”,扫码文末二维码即可关注,欢迎一起交流! redis在容器化的过程中,涉及到纵向扩pod实例cpu、内存以及redis实例的maxmemory值,statefulset管理的pod需要...

码农实战
今天
4
0
为什么阿里巴巴Java开发手册中不建议在循环体中使用+进行字符串拼接?

之前在阅读《阿里巴巴Java开发手册》时,发现有一条是关于循环体中字符串拼接的建议,具体内容如下: 那么我们首先来用例子来看看在循环体中用 + 或者用 StringBuilder 进行字符串拼接的效率...

武培轩
今天
8
0
队列-链式(c/c++实现)

队列是在线性表功能稍作修改形成的,在生活中排队是不能插队的吧,先排队先得到对待,慢来得排在最后面,这样来就形成了”先进先出“的队列。作用就是通过伟大的程序员来实现算法解决现实生活...

白客C
今天
81
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部