`
jackson_jar
  • 浏览: 37011 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

一个不错的xml工具

    博客分类:
  • java
XML 
阅读更多

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.util.ArrayList;
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;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

public class XmlUtil {

 /**
  * 取得xml文件的根节点名称,即消息名称。
  * @param xmlStr xml内容
  * @return String 返回名称
  */
 public static String getRootName(String xmlStr) throws Exception {
  SAXBuilder builder = new SAXBuilder();
  Document doc = builder.build(new StringReader(xmlStr));
  Element root = doc.getRootElement();
  return root.getName();
 }

 

 /**
  * 把xml文件转换为map形式,其中key为有值的节点名称,并以其所有的祖先节点为前缀,用
  * "."相连接。如:SubscribeServiceReq.Send_Address.Address_Info.DeviceType
  * @param xmlStr xml内容
  * @return Map 转换为map返回
  */
 public static Map<String , String> xml2Map(String xmlStr) throws JDOMException, IOException {
  Map<String , String> rtnMap = new HashMap<String , String>();
  SAXBuilder builder = new SAXBuilder();
  Document doc = builder.build(new StringReader(xmlStr));
  // 得到根节点
  Element root = doc.getRootElement();
  String rootName = root.getName();
  rtnMap.put("root.name", rootName);

  // 调用递归函数,得到所有最底层元素的名称和值,加入map中
  convert(root, rtnMap, rootName);

  return rtnMap;
 }

 /**
  * 递归函数,找出最下层的节点并加入到map中,由xml2Map方法调用。
  * @param e xml节点,包括根节点
  * @param map 目标map
  * @param lastname 从根节点到上一级节点名称连接的字串
  */
 public static void convert(Element e, Map<String , String> map, String lastname) {
  if (e.getAttributes().size() > 0) {
   Iterator it_attr = e.getAttributes().iterator();
   while (it_attr.hasNext()) {
    Attribute attribute = (Attribute)it_attr.next();
    String attrname = attribute.getName();
    String attrvalue = e.getAttributeValue(attrname);
    map.put(lastname + "." + attrname, attrvalue);
   }
  }
  List children = e.getChildren();
  Iterator it = children.iterator();
  while (it.hasNext()) {
   Element child = (Element) it.next();
   String name = lastname + "." + child.getName();
   // 如果有子节点,则递归调用
   if (child.getChildren().size() > 0) {
    convert(child, map, name);
   } else {
    // 如果没有子节点,则把值加入map
    map.put(name, child.getText());
    // 如果该节点有属性,则把所有的属性值也加入map
    if (child.getAttributes().size() > 0) {
     Iterator attr = child.getAttributes().iterator();
     while (attr.hasNext()) {
      Attribute attribute = (Attribute)attr.next();
      String attrname = attribute.getName();
      String attrvalue = child.getAttributeValue(attrname);
      map.put(name + "." + attrname, attrvalue);
     }
    }
   }
  }
 }

 /**
  * 把xml文件转换为list形式,其中每个元素是一个map,map中的key为有值的节点名称,并以其所有的祖先节点为前缀,用
  * "."相连接。如:SubscribeServiceReq.Send_Address.Address_Info.DeviceType
  * @param xmlStr xml内容
  * @return Map 转换为map返回
  */
 public static List<Map<String,String>> xml2List(String xmlStr) throws JDOMException, IOException {
  List<Map<String,String>> rtnList = new ArrayList<Map<String,String>>();
  Map<String , String> rtnMap = new HashMap<String , String>();
  SAXBuilder builder = new SAXBuilder();
  Document doc = builder.build(new StringReader(xmlStr));
  // 得到根节点
  Element root = doc.getRootElement();
  String rootName = root.getName();
  rtnMap.put("root.name", rootName);

  // 调用递归函数,得到所有最底层元素的名称和值,加入map中
  convert2List(root, rtnMap, rootName, rtnList);
  if(rtnList.size()==0)
   rtnList.add(rtnMap);
  return rtnList;
 }

 /**
  * 递归函数,找出最下层的节点并加入到map中,如果有相同的节点,则加入list中,
  * 由xml2List方法调用。
  * @param e xml节点,包括根节点
  * @param map 目标map
  * @param lastname 从根节点到上一级节点名称连接的字串
  * @param list 相同节点生成map放入list中
  */
 public static void convert2List(Element e, Map<String , String> map, String lastname, List<Map<String,String>> list) {
  if (e.getAttributes().size() > 0) {
   Iterator it_attr = e.getAttributes().iterator();
   while (it_attr.hasNext()) {
    Attribute attribute = (Attribute)it_attr.next();
    String attrname = attribute.getName();
    String attrvalue = e.getAttributeValue(attrname);
    map.put(lastname + "." + attrname, attrvalue);
   }
  }
  List children = e.getChildren();
  Iterator it = children.iterator();
  while (it.hasNext()) {
   Element child = (Element)it.next();
   String name = lastname + "." + child.getName();
   // 如果有子节点,则递归调用
   if (child.getChildren().size() > 0) {
    convert(child, map, name);
   } else {
    // 如果没有子节点,则把值加入map
    map.put(name, child.getText());
    // 如果该节点有属性,则把所有的属性值也加入map
    if (child.getAttributes().size() > 0) {
     Iterator attr = child.getAttributes().iterator();
     while (attr.hasNext()) {
      Attribute attribute = (Attribute)attr.next();
      String attrname = attribute.getName();
      String attrvalue = child.getAttributeValue(attrname);
      map.put(name + "." + attrname, attrvalue);
     }
    }
   }
   //如果有相同节点,则加入list中,不考虑子节点中又有相同节点的情况
   if(e.getChildren(child.getName()).size()>1){
    Map<String,String> aMap = new HashMap<String,String>();
    aMap.putAll(map);
    list.add(aMap);
    map= new HashMap<String,String>();
    map.put("root.name", aMap.get("root.name"));
   }

  }
 }


 /**
  * 打印map 的所有key和value
  * @param map
  */
 public static void printMap(Map<String , String> map) {
  Iterator<String> keys = map.keySet().iterator();
  while (keys.hasNext()) {
   String key =  keys.next();
   System.out.println(key + ":" +  map.get(key));
  }
 }
 
    /**
     * 格式化xml
     * @param xmlStr
     * @param encode
     * @return String
     * @date Apr 30, 2008
     */
    @SuppressWarnings("deprecation")
 public static String formatXml(String xmlStr, String encode ) {
     
  SAXBuilder sb = new SAXBuilder();
  Reader reader = new StringReader(xmlStr);
 
  Document doc = null;
  try {
   doc = sb.build(reader);
  }
  catch (Exception e) {
   //do nosth
  }
 
  XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
        outputter.setEncoding(encode);
  String result = "" ;
  if(null != doc){
   result = outputter.outputString(doc);
  }
 
  return result;
 }
}

 

分享到:
评论

相关推荐

    一个不错的绿色版XML编辑工具

    总的来说,这款绿色版XML编辑工具提供了一套基础且实用的功能,对于XML初学者和轻量级用户来说,它是一个不错的选择。然而,对于专业开发人员或需要处理大量XML数据的人来说,可能需要考虑更全面和强大的XML编辑软件...

    一个不错的XML文件格式化工具

    安装方便,不占磁盘空间,小巧玲珑的XML文件格式化工具

    几种XML解析技术及工具比较

    项目中如果对性能要求不是特别高,而希望有更友好的编程接口,JDOM是一个不错的选择。 4. DOM4J DOM4J是另一个基于Java的XML处理库,它结合了DOM、SAX和DOM4J自己的API。DOM4J提供了一种灵活、高性能的方式来处理...

    如何读写XML文件,一个不错的实例

    本篇文章将通过一个实例详细讲解如何在C#中进行XML文件的操作。 首先,我们需要引入System.Xml命名空间,它提供了处理XML的基本类库。在C#中,读取XML文件最常用的是`XmlDocument`类,它提供了一种树形结构来表示...

    xmlview 阅读工具

    xmlview是一款不错的xml阅读工具,节点更具有层次性的视图比浏览器更专业。

    XML编辑软件

    虽然它不是专为XML设计的,但通过安装XML插件,它可以成为一个非常不错的XML编辑器。特点包括: - 支持语法高亮和代码折叠,使XML文件更易读。 - 提供XML格式化功能,可以自动整理XML文档结构。 - 集成了XPath...

    xml解析jar包

    1. dom4j-1.6.1.jar:这是一个灵活且功能强大的Java XML API,它提供了全面的XML处理功能,包括XML的读取、写入、修改、搜索以及XPath支持。DOM4J基于DOM模型,但更易于使用,且性能优于标准DOM。它支持事件驱动的...

    一款不错的汉化版Supernova XML Website flashden出品

    Supernova XML Website是这款产品的名称,它表明这是一个具有动态内容管理功能的网站模板;而“flash”则提示我们,这款产品是基于Flash技术构建的,可能包含丰富的交互元素和视觉效果。 根据压缩包子文件的文件...

    idea工具中直接从mapper.Java文件中跳转到mapper.xml文件的插件,挺不错的

    MyBatis是一个优秀的持久层框架,它支持定制化的SQL、存储过程以及高级映射。Mapper接口是MyBatis的核心组成部分,它定义了数据库操作的方法,而Mapper XML文件则包含了这些方法对应的SQL语句和结果映射。在传统的...

    xml temple

    "XML Temple"可能是指一个关于XML解析、创建或验证的工具或者教程,它可以帮助开发者更好地理解和操作XML文档。 在IT行业中,XML因其自描述性和灵活性,成为数据传输和存储的重要方式。它允许用户定义自己的标记来...

    java 解析XML性能对比分析Demo

    DOM解析器将整个XML文档加载到内存中,形成一个树形结构,允许开发者通过节点遍历访问XML数据。这种方法的优点是操作方便,但缺点是对内存消耗大,不适用于处理大型XML文件。 2. SAX(简单API for XML)解析: 与...

    xml帮助类,xml,C#

    不过,对于需要完整DOM(Document Object Model)表示的场景,`XmlDocument`是一个不错的选择。 综上所述,XML帮助类在C#和ASP.NET开发中起着关键作用,它们简化了XML文档的处理,使开发者能够更高效地读取、创建、...

    MarkUP ,用于VC环境下,读取和写入XMl文档文件 不错的程序.zip

    总的来说,"MarkUP"是一个基于VC++的XML处理工具,它利用了MSXML库进行XML的读写操作,具有良好的可集成性和可扩展性。开发者可以通过源代码学习如何在C++环境中高效地处理XML文档,这对于需要处理大量XML数据的项目...

    pb各版本 操作 xml

    压缩包中的文件 "pb操作XML的例子-很不错061211-pb9" 很可能包含一个实际的PowerBuilder项目或代码示例,演示了如何在PowerBuilder 9中操作XML。通过研究这个例子,你可以更深入地了解上述概念,并将其应用到自己...

    VB_XML.rar_ VB_XML_VB speeaksdk xml_vb xml_xml_xml vb

    这通常意味着压缩包内可能有一个VB项目文件或源代码文件,可能是一个完整的工程或者一个包含多个模块的文件,演示了如何在VB中读取、写入、解析和操作XML文件。 学习这个压缩包中的内容,你可以了解以下VB和XML相关...

    很不错的XML编辑器

    一个优秀的XML编辑器能够帮助开发者高效地编写、查看和修改XML文档,确保其结构正确无误。下面,我们将详细讨论XML编辑器的重要功能和特性,以及如何选择和使用XML编辑器。 XML编辑器的主要功能: 1. **语法高亮**...

    一款不错的甘特图JS+XML组件

    这款名为“不错的甘特图JS+XML组件”的工具,是专为Web应用程序设计的,它结合了JavaScript(JS)的动态性和XML的数据交换能力,帮助开发者在B/S(浏览器/服务器)架构下快速构建功能丰富的甘特图。 1. **...

    不错的Flash+XML banner翻页效果

    本文将深入探讨“不错的Flash+XML banner翻页效果”这一主题,它是一种常见于电子书效果中的技术,用于增强用户的视觉体验和互动性。 Flash是一款曾广泛使用的交互式内容创作工具,特别适用于创建动态图形、动画...

    一个很不错的点阵生成工具

    在描述中提到的“一个很不错的点阵生成工具”是一个高效且多用途的程序,它能够生成各种格式和字体的点阵。这意味着用户可以选择不同的字符集、字体样式和大小,以便在不同的LCD设备上获得最佳的显示效果。这个工具...

Global site tag (gtag.js) - Google Analytics