dom4j解析xml方法

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:   package paserImpl;import java.io.ByteArrayOutputStream;import java.util.ArrayList;import java.

 

package  paserImpl;

import  java.io.ByteArrayOutputStream;
import  java.util.ArrayList;
import  java.util.Collection;
import  java.util.HashMap;
import  java.util.Iterator;
import  java.util.List;
import  java.util.Map;
import  java.util.regex.Matcher;
import  java.util.regex.Pattern;

import  org.dom4j.Document;
import  org.dom4j.DocumentHelper;
import  org.dom4j.Element;
import  org.dom4j.Node;
import  org.dom4j.io.OutputFormat;
import  org.dom4j.io.XMLWriter;

/**
 * XML描述的解析
 * 
 *
@author zxs_9999
 
*/

public   class  GenericXmlMessage  {
 
    
private Document doc;
    
private Map internalMsg = new HashMap();
    
private Collection cdataPathList = new ArrayList(); //只为CDATA的节点路径列表
    private static final Pattern pattern = Pattern.compile("/[/d/]$");
    
    
public GenericXmlMessage() {
        doc 
= DocumentHelper.createDocument();
        internalMsg.put(
"CDATAPathList",cdataPathList);
    }


    
public GenericXmlMessage(Document doc) {

        
this.doc = doc;
        
    }


    
/**
     * 得到默认类别的键值
     *
     * 
@param key String
     * 
@return Object
     
*/

    
public Object get(String key) {
        
return get("value", key);
    }


    
/**
     * 得到默认类别的键值
     *
     * 
@param key String
     * 
@return Object
     
*/

    
public String getString(String key) {
        
return (String) get("value", key);
    }


    
/**
     * 得到某类别的键值
     
*/

    
public Object get(String category, String key) {
        
if (category.equals("list")) {
            List list 
= doc.selectNodes(key);
            List values 
= new ArrayList();
            
for (Iterator itr = list.iterator(); itr.hasNext();) {
                Element element 
= (Element) itr.next();
                values.add(element.getText());
            }

            
return values;
        }
 else {
            
if (key.startsWith("//")) {
                
//XML节点
                Node node = doc.selectSingleNode(key);
                
if (node == null{
                    
return "";
                }
 else {
                 
if(node.getText()!= null && node.getText().length()> 0)
                 
{
                  
//获取节点值
                  return node.getText();
                 }

                 
else if(((Element)node).attribute("val"!= null && ((Element)node).attribute("val").getValue().length()>0)
                 
{
                  
//获取属性
                  return ((Element)node).attribute("val").getValue();
                 }

                 
else
                 
{
                  
return "";
                 }

                }

            }
 else {
                
//非xml节点
                return internalMsg.get(key);
            }


        }

    }


    
/**
     * 得到某类别的键值
     
*/

    
public String getString(String category, String key) {
        
if (category.equals("list")) {
            
throw new IllegalArgumentException("not allow list here");
        }
 else {
            
if (key.startsWith("//")) {
                
//XML节点
                Node node = doc.selectSingleNode(key);
                
if (node == null{
                    
return "";
                }
 else {
                    
return node.getText();
                }

            }
 else {
                
//非xml节点
                return (String) internalMsg.get(key);
            }


        }

    }


    
/**
     * 设置键值
     
*/

    
public void set(String key, Object value) {

        set(
"TEXT", key, value);
    }


    
private Node createNewNodeByXPath(String xpath) {
        
if (xpath.startsWith("//")) {
            String[] nodes 
= xpath.substring(2, xpath.length()).split("/");
            String root 
= nodes[0];
            Element currentElement 
= doc.getRootElement();
            
if (currentElement == null{
                currentElement 
= doc.addElement(root);
            }

            
for (int i = 1; i < nodes.length; i++{
                Matcher matcher 
= pattern.matcher(nodes[i]);
                
if (matcher.find()) {
                    
//多个要素
                    String numberStr = matcher.group(0);
                    
int n = Integer.parseInt(numberStr.substring(1, numberStr.length() - 1));
                    String elementName 
= nodes[i].substring(0, matcher.start());
                    
int size = currentElement.elements(elementName).size();
                    
if (size < n) {
                        
for (int j = size; j < n; j++{
                            currentElement.addElement(elementName);
                        }

                    }

                    currentElement 
= (Element) currentElement.elements(elementName).get(n - 1);
                }
 else {
                    
//单个要素
                    Element element = currentElement.element(nodes[i]);
                    
if (element == null{
                        element 
= currentElement.addElement(nodes[i]);
                    }

                    currentElement 
= element;
                }


            }

            
return currentElement;
        }

        
return null;
    }


    
/**
     * 设置键值
     
*/

    
public void set(String category, String key, Object value) {
        
if (key.startsWith("//")) {
            
//XML节点
            Node node = doc.selectSingleNode(key);
            
if (node == null{
                node 
= createNewNodeByXPath(key);
            }

            
if (category.equalsIgnoreCase("CDATA")) {
                ((Element) node).addCDATA((String)value);
                cdataPathList.add(key);
                
//System.out.println(node);
            }
 else {                
             
if(get("value""ClientType"!= null && ((String)get("value""ClientType")).equals("1"))
             
{
              System.out.println(
"当前是字符终端3");
              
//当前是字符终端
              ((Element) node).addAttribute("val",(String) value);
             }

             
else
             
{
              node.setText((String) value);
             }

                
            }

        }
 else {
            
//非xml节点
            internalMsg.put(key, value);
        }


    }


    
/**
     * 清除所有信息
     
*/

    
public void clear() {
        doc.clearContent();
    }


    
/**
     * 得到所有的category
     
*/

    
public Collection findAllCategories() {
        
return new ArrayList();
    }


    
/**
     * 得到某一个category的所有值
     
*/

    
public Collection findAllKeysByCategory(String category) {
        
return new ArrayList();
    }


    
/**
     * 得到XML描述
     *
     * 
@return 返回XML
     
*/

    
public String asXML() {
     
        XMLWriter writer 
= null;
        
/** 格式化输出,类型IE浏览一样 */
        OutputFormat format 
= OutputFormat.createPrettyPrint();
        
/** 指定XML编码 */
        format.setEncoding(
"GBK");
        writer 
= new XMLWriter();
     ByteArrayOutputStream   baos   
=   new   ByteArrayOutputStream();
        
try
        
{
         writer
= new XMLWriter(baos,format);
         writer.write(doc);
         writer.close();
        }

        
catch(Exception ex)
        
{
         System.out.println(
"发生错误!");
        }
      
        
//return doc.asXML();
     return baos.toString();
    }



}

 
目录
相关文章
|
9天前
|
监控 安全 网络安全
深入解析PDCERF:网络安全应急响应的六阶段方法
PDCERF是网络安全应急响应的六阶段方法,涵盖准备、检测、抑制、根除、恢复和跟进。本文详细解析各阶段目标与操作步骤,并附图例,助读者理解与应用,提升组织应对安全事件的能力。
159 89
|
1月前
|
安全 Ubuntu Shell
深入解析 vsftpd 2.3.4 的笑脸漏洞及其检测方法
本文详细解析了 vsftpd 2.3.4 版本中的“笑脸漏洞”,该漏洞允许攻击者通过特定用户名和密码触发后门,获取远程代码执行权限。文章提供了漏洞概述、影响范围及一个 Python 脚本,用于检测目标服务器是否受此漏洞影响。通过连接至目标服务器并尝试登录特定用户名,脚本能够判断服务器是否存在该漏洞,并给出相应的警告信息。
182 84
|
23天前
|
数据可视化 项目管理
个人和团队都好用的年度复盘工具:看板与KPT方法解析
本文带你了解高效方法KPT复盘法(Keep、Problem、Try),结合看板工具,帮助你理清头绪,快速完成年度复盘。
84 7
个人和团队都好用的年度复盘工具:看板与KPT方法解析
|
7天前
|
人工智能 监控 数据可视化
提升开发效率:看板方法的全面解析
随着软件开发复杂度提升,并行开发模式下面临资源分配不均、信息传递延迟及缺乏全局视图等瓶颈问题。看板工具通过任务状态实时可视化、流量效率监控和任务依赖管理,帮助团队直观展示和解决这些瓶颈。未来,结合AI预测和自动化优化,看板工具将更高效地支持并行开发,成为驱动协作与创新的核心支柱。
|
1月前
|
存储 Java 开发者
浅析JVM方法解析、创建和链接
上一篇文章《你知道Java类是如何被加载的吗?》分析了HotSpot是如何加载Java类的,本文再来分析下Hotspot又是如何解析、创建和链接类方法的。
|
1月前
|
负载均衡 网络协议 算法
Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式
本文探讨了Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式,以及软件负载均衡器、云服务负载均衡、容器编排工具等实现手段,强调两者结合的重要性及面临挑战的应对措施。
105 3
|
2月前
|
JSON PHP 数据格式
PHP解析配置文件的常用方法
INI文件是最常见的配置文件格式之一。
62 12
|
3月前
|
JavaScript
DOM 节点列表长度(Node List Length)
DOM 节点列表长度(Node List Length)
|
3月前
|
JavaScript
HTML DOM 节点树
HTML DOM 节点是指在 HTML 文档对象模型中,文档中的所有内容都被视为节点。整个文档是一个文档节点,每个 HTML 元素是元素节点,元素内的文本是文本节点,属性是属性节点,注释是注释节点。DOM 将文档表示为节点树,节点之间有父子和同胞关系。
|
3月前
|
JavaScript
HTML DOM 节点
HTML DOM(文档对象模型)将HTML文档视为节点树,其中每个部分都是节点:文档本身是文档节点,HTML元素是元素节点,元素内的文本是文本节点,属性是属性节点,注释是注释节点。节点间存在父子及同胞关系,形成层次结构。

推荐镜像

更多