dom4j解析xml方法

简介:   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();
    }



}

 
目录
相关文章
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
3294 1
|
10月前
|
XML 数据采集 API
用Lxml高效解析XML格式数据:以天气API为例
免费Python教程:实战解析中国天气网XML数据,详解Lxml库高效解析技巧、XPath用法、流式处理大文件及IP封禁应对策略,助你构建稳定数据采集系统。
451 0
|
编解码 缓存 Prometheus
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
本期内容为「ximagine」频道《显示器测试流程》的规范及标准,我们主要使用Calman、DisplayCAL、i1Profiler等软件及CA410、Spyder X、i1Pro 2等设备,是我们目前制作内容数据的重要来源,我们深知所做的仍是比较表面的活儿,和工程师、科研人员相比有着不小的差距,测试并不复杂,但是相当繁琐,收集整理测试无不花费大量时间精力,内容不完善或者有错误的地方,希望大佬指出我们好改进!
1442 16
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
|
XML JavaScript Android开发
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
634 15
|
JSON 监控 网络协议
Bilibili直播信息流:连接方法与数据解析
本文详细介绍了自行实现B站直播WebSocket连接的完整流程。解析了基于WebSocket的应用层协议结构,涵盖认证包构建、心跳机制维护及数据包解析步骤,为开发者定制直播数据监控提供了完整技术方案。
2596 9
|
安全 IDE Java
重学Java基础篇—Java Object类常用方法深度解析
Java中,Object类作为所有类的超类,提供了多个核心方法以支持对象的基本行为。其中,`toString()`用于对象的字符串表示,重写时应包含关键信息;`equals()`与`hashCode()`需成对重写,确保对象等价判断的一致性;`getClass()`用于运行时类型识别;`clone()`实现对象复制,需区分浅拷贝与深拷贝;`wait()/notify()`支持线程协作。此外,`finalize()`已过时,建议使用更安全的资源管理方式。合理运用这些方法,并遵循最佳实践,可提升代码质量与健壮性。
562 1
|
传感器 监控 Java
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
658 5
|
人工智能 监控 数据可视化
提升开发效率:看板方法的全面解析
随着软件开发复杂度提升,并行开发模式下面临资源分配不均、信息传递延迟及缺乏全局视图等瓶颈问题。看板工具通过任务状态实时可视化、流量效率监控和任务依赖管理,帮助团队直观展示和解决这些瓶颈。未来,结合AI预测和自动化优化,看板工具将更高效地支持并行开发,成为驱动协作与创新的核心支柱。
|
XML 前端开发 Java
讲解SSM的xml文件
本文详细介绍了SSM框架中的xml配置文件,包括springMVC.xml和applicationContext.xml,涉及组件扫描、数据源配置、事务管理、MyBatis集成以及Spring MVC的视图解析器配置。
415 1
|
Android开发 开发者
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
本文详细介绍了如何通过自定义 `attrs.xml` 文件实现 Android 自定义 View 的属性配置。以一个包含 TextView 和 ImageView 的 DemoView 为例,讲解了如何使用自定义属性动态改变文字内容和控制图片显示隐藏。同时,通过设置布尔值和点击事件,实现了图片状态的切换功能。代码中展示了如何在构造函数中解析自定义属性,并通过方法 `setSetting0n` 和 `setbackeguang` 实现功能逻辑的优化与封装。此示例帮助开发者更好地理解自定义 View 的开发流程与 attrs.xml 的实际应用。
430 2
Android自定义View之不得不知道的文件attrs.xml(自定义属性)

推荐镜像

更多
  • DNS