用DOM/JDOM解析XML文件(2)

JDOM实现XML文件的遍历 前言:DOM和SAX是跨语言的XML的解析准备,在Java 中使用却没有那么方便。Java 拥有自己的JDOM 和DOM4J(DOM for Java),这两个是专门为Java语言提供的解析工具,使用起来很方便,本文首先来介绍一下运用JDOM下的DOM和SAX分别来实现对XML文件元素的遍历。 1、使用DOM方式。   (1)首先我们有一个XML文件,存储student 元素: 阅读详情

      很久没有发贴了,似乎已经彻底遗忘了这个角落。也许,只有在心情低落的时候才会想起,只有我的blog能陪我彻夜无眠。就像一只受伤的动物,总有一个秘密的藏身之处,与世隔绝,只有自己知道,在这个私人的角落,有梦想、有回忆、有失落、也有甜蜜……

      上次的文章末尾提到要补一个同样功能的JDom版XML解析器,找了半天,似乎丢了,勉强看到一个,也不知道是不是当时的最终版本,乍一看上去,应该差不多的,就拿来充充数吧。我想我是彻底的堕落了,竟然要这么长时间才能续写一篇早已承诺的文字。要不是今夜无眠,不知又要推到什么时候了呢。

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;

/**
* <p>ConfigParser</p>
* 1. read the config XML,or update the file.</br>
* 2. query a property from the config file,the property name fromat:A.B.C etc.</br>
* 3. add properties into the config file.</br>
*
* @author javer QQ:84831612
*/
public class ConfigParser
{
   private File file;
   private Document doc;

   private Map propertyCache = new HashMap();

   public ConfigParser(String filePath)
   {
      this.file = new File(filePath);
      try {
      SAXBuilder builder = new SAXBuilder();
      doc = builder.build(new File(filePath));
   }
   catch (Exception e) {
      System.err.println("Error creating XML parser in ConfigParser.java");
      e.printStackTrace();
   }
}

/**
* Return all children property names of a parent property as a String array,
* or an empty array if the if there are no children. For example, given
* the properties <tt>X.Y.A</tt>, <tt>X.Y.B</tt>, and <tt>X.Y.C</tt>, then
* the child properties of <tt>X.Y</tt> are <tt>A</tt>, <tt>B</tt>, and
* <tt>C</tt>.
*
* @param parent the name of the parent property.
* @return all child property values for the given parent.
*/
public String [] getChildrenProperties(String parent) {
   String[] propName = parsePropertyName(parent);
   Element element = doc.getRootElement();
   for (int i = 0; i < propName.length; i++) {
      element = element.getChild(propName[i]);
      if (element == null) {
         return new String [] { };
      }
   }
   List children = element.getChildren();
   int childCount = children.size();
   String [] childrenNames = new String[childCount];
   for (int i=0; i<childCount; i++) {
      childrenNames[i] = ((Element)children.get(i)).getName();
   }
   return childrenNames;
}

/**
* Return the value of the specified property.
*
* @param name the name of the property to get.
* @return the value of the specified property.
*/
public String getValue(String name)
{
   if (propertyCache.containsKey(name)) {
      return (String)propertyCache.get(name);
   }

   String[] propName = parsePropertyName(name);
   Element element = doc.getRootElement();
   for (int i = 0; i < propName.length; i++) {
      element = element.getChild(propName[i]);
      if (element == null) {
         return null;
      }
   }

   String value = element.getText();
   if ("".equals(value)) {
      return null;
   }
   else {
      propertyCache.put(name, value);
      return value;
   }
}

/**
* Return the value when the specified property key and value is existent,
* and return null if the specified property key and value is not existent
*
* @param name
* @param value
* @return
*/
public String findValue(String name,String value)
{
   String[] propName = parsePropertyName(name);

   Element element = doc.getRootElement();
   return findValue(element,0,propName,value);
}

private String findValue(Element element, int depth, String[] propName, String value)
{
   String _value = null;
   if(depth == propName.length)
   {
      _value = element.getText();
      if (_value.equals(value))
         return value;
      else
         return null;
   }

   List children = element.getChildren(propName[depth]);
   if(children==null || children.size()<1)
      return null;
   else
      ++depth;

   for(int i=0;i<children.size();i++)
   {
      element = (Element)children.get(i);
      _value = findValue(element,depth,propName,value);
      if(_value != null)
      {
         return value;
      }
   }

   return null;
}

/**
* Update the value of the specified property. If the property doesn't
* currently exist, it will be automatically created.
* @param name
* @param value
*/
public void updateValue(String name,String value)
{
   propertyCache.put(name, value);

   String[] propName = parsePropertyName(name);
   Element element = doc.getRootElement();
   for (int i=0; i<propName.length; i++) {
      if (element.getChild(propName[i]) == null) {
         element.addContent(new Element(propName[i]));
      }
      element = element.getChild(propName[i]);
   }

   element.setText(value);
   store();
}

/**
* <p>Add the values by the specified properties.</p>
* For example:</br>
* if values is existed as follow</br>
* x.y.z1=1</br>
* .z2=2</br>
* .z3=3</br>
* and now, you need add new values as a new group,like as follow values</br>
* x.y.z1=11</br>
* .z2=22</br>
* .z3=33</br>
* you need call this function like as follow:</br>
* addValue("x.y",new String[]{"z1","z2","z3"},new String[]{"11","22","33"})</br>
* and the XML will have a result as follow:</br>
* <xml>
* <x>
* <y>
* <z1>1</z1>
* <z2>2</z2>
* <z2>3</z2>
* </y>
* </x>
* <x>
* <y>
* <z1>11</z1>
* <z2>22</z2>
* <z2>33</z2>
* </y>
* </x>
* </xml>
*
*
* @param parentName
* @param subNames
* @param values
*/
public void addValue(String parentName,String[] subNames,String[] values)
{
   String[] propName = parsePropertyName(parentName);

   Element element = doc.getRootElement();
   for (int i=0; i<propName.length-1; i++) {
      if (element.getChild(propName[i]) == null) {
         element.addContent(new Element(propName[i]));
      }
      element = element.getChild(propName[i]);
   }

   Element parentElement = new Element(propName[propName.length-1]);
   element.addContent(parentElement);

   for(int i=0;i<subNames.length;i++)
   {
      element = new Element(subNames[i]);
      element.setText(values[i]);
      parentElement.addContent(element);
   }

   store();
}

/**
* Deletes the specified property.
*
* @param name the property to delete.
*/
public void deleteProperty(String name) {
   String[] propName = parsePropertyName(name);
   Element element = doc.getRootElement();
   for (int i=0; i<propName.length-1; i++) {
      element = element.getChild(propName[i]);
      if (element == null) {
         return;
      }
   }
   element.removeChild(propName[propName.length-1]);
   store();
}

private synchronized void store()
{
   OutputStream out = null;
   boolean error = false;
   File tempFile = new File(file.getParentFile(), file.getName() + ".tmp");
   try {
      XMLOutputter outputter = new XMLOutputter();
      out = new BufferedOutputStream(new FileOutputStream(tempFile));
      outputter.output(doc, out);
   }
   catch (Exception e) {
      e.printStackTrace();
      error = true;
   }
   finally {
      try { out.close(); }
      catch (Exception e) {
         e.printStackTrace();
         error = true;
      }
   }

   if (!error) {
      file.delete();
      tempFile.renameTo(file);
   }
}

/**
* Returns an array representation of the given Lss config property. Lss config
* properties are always in the format "prop.name.is.this" which would be
* represented as an array of four Strings.
*
* @param name the name of the Lss Config property.
* @return an array representation of the given Lss Config property.
*/
private String[] parsePropertyName(String name) {
   int size = 1;
   for (int i=0; i<name.length(); i++) {
      if (name.charAt(i) == '.') {
         size++;
      }
   }
   String[] propName = new String[size];
   StringTokenizer tokenizer = new StringTokenizer(name, ".");
   int i = 0;
   while (tokenizer.hasMoreTokens()) {
      propName[i] = tokenizer.nextToken();
      i++;
   }
   return propName;
}
}

   

Java【JDOM】解析XML文档并输出字符串 在上一篇博客中写到,用Java【JDOM】把输入的字符串以XML信息的格式输出:点击查看文章——Java【jdom】输入字符串并输出XML格式的信息 在这篇博客中,我将要写到,用Java【JDOM】把XML信息输出成字符串,其他方式可参考博客最下面链接中的文章 【解析XML的方式有以下四种】 DOM方式解析XML Dom解析是将xml文件全部载入到内存,组装成一颗dom树,然后通过节点以... 阅读详情

相关推荐

对xml的三种解析方法:DOM ,JDOM,DOM4J

文章目录1.一般 .xml文件的结构2. DOM解析 .xml2.1 解析的数据源对象是一个对象student -单数2.2 解析的对象是多个对象 students for循环3. JDOM解析3.1 JDOM生成.xml文件 文件输出流3.2 JDOM对.xml文件解析4. DOM4J解析4.1 DOM4J生成.xml文件4.2 DOM4J解析.xml文件5. 总结: 1.一般 .xml文件的结...

CacaColor的博客 272

Jdom解析多层xml文件

Jdom解析多层xml文件 一、Jdom简介: JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。     JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念以及映射),把SAX和DOM的功能有效地结合起来。 在使用设计上尽可能地隐藏原来使用XML过程中的复杂性。利用JDOM处理XML文档

md_shmily92的专栏 1724

掌握Java DOM与JDOM的XML处理技术

本文还有配套的精品资源,点击获取 简介:Java DOM和JDOM是处理XML文档的两种核心库,都基于W3C的DOM规范。DOM是一个跨平台的标准API,而JDOM是专为Java优化的DOM实现,提供了更直观的API和性能优化。了解两者的不同,有助于在实际项目中根据需求选择合适的XML处理方法。 1. DOM和JDOM基础介绍 在当今的IT领域中,XML作为...

weixin_35750747的博客 997

DOM、JDOM、DOM4J解析XML

DOM、JDOM、DOM4J解析XML JAVA解析XML通常有两种方式,DOM和SAX(SAX前面已经示范) DOM:Document Object Model(文档对象模型) DOM的特性: 定义一组JAVA接口,基于对象,与语言和平台无关将XML文档表示为树,在内存中解析和存储XML文档,允许随机访问文档的不同部分 DOM解析XML DOM的优点,由于树在内存中是持久的,因此可以修改后更新,它还可以在任何时候在树中上下导航,API使用起来也比较简单。 解析步骤: DocumentBuilderFact

七一 1043

Silvaco Atlas(五)——物理模型总结

物理模型总结

qsz1425AWD2121的博客 2151

避坑指南:麒麟系统ARM架构下PostGIS离线安装常见问题解析

本文深度解析了在国产麒麟系统ARM64架构下进行PostGIS离线安装的完整路径与核心避坑点。通过对比Docker容器化与源码编译两种部署方式的优劣,详细阐述了离线Docker环境搭建、ARM64镜像获取验证、容器化配置及常见故障排查的全流程,为在特殊环境下稳定部署空间数据库提供了一套可靠的实践指南。

Python的专栏 287

用DOM/JDOM解析XML文件

   夜已经深了,可是我仍未眠。明天就要回家过年了,对于一个飘荡在外的游子来说,回家过年是一件多么激动人心的事啊!这才是我心中真正的年啊!   真希望新的一年快点到来,因为有太多的不愉快需要忘记、因为有太多的梦想需要去实现……    前一段时间要解析一个XML文件,就是对XML进行增、删、改的操作。以前做J2EE时一直都是用第三方的类库来辅助解决的,但这次却要求自己用DOM来解析,只能用J

4071

在abaqus中利用point-based 来快捷定义螺栓连接

abaqus中可以通过point-based方式定义连接点的位置,并对连接方式进行定义,可以进行螺栓连接的模拟。 可以通过逐点输入坐标或导入外部的坐标位置 也可以通过阵列的方式定义点 定义完点后就利用create fasteners,选择point-based,选取刚才创建好的点阵列,然后定义连接的属性,如下图 定义connector section时,类型选择translator,相当于只有1方向可以动,定义弹性模量以及破坏准则。 案例操作 假如有两个板,通过...

fiber_tape的博客 7340

对XML文件的解析,DOM、SAX、JDOM、JAXB还有dom4

1.  DOM(Document Object Model)   此 方法主要由W3C提供,它将xml文件全部读入内存中,然后将各个元素组成一棵数据树,以便快速的访问各个节点 。 因此非常消耗系统性能 ,对比较大的文档不适宜采用DOM方法来解析。 DOM API 直接沿袭了 XML 规范。每个结点都可以扩展的基于 Node 的接口,就多态性的观点来讲,它是优秀的,但是在 Java 语言中的应用不

hexi_sijin的专栏 1711

手把手教你用ADS优化肖特基二极管检波电路(附RC参数避坑指南)

本文详细介绍了如何使用ADS软件优化肖特基二极管检波电路,包括RC参数设置、常见失真问题分析与解决方案。通过实战案例和参数优化技巧,帮助射频工程师避免设计陷阱,提升电路性能。特别附有RC参数避坑指南,适用于调幅解调、功率检测等应用场景。

m2n3o4p5的博客 198

LTspice仿真实战:共模电感差模/共模插入损耗测试全流程(附WE 744821201参数)

本文以Würth Elektronik 744821201型号共模电感为例,详细介绍了在LTspice中搭建差模与共模插入损耗测试电路的全流程。通过从规格书提取关键参数、构建SPICE模型,到执行仿真并与官方数据对比,旨在帮助硬件工程师在PCB设计前期精准预测EMC性能,弥合器件选型与系统设计之间的鸿沟。

info6的博客 761

Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)

【目录】 一、【基础知识——扫盲】 二、【DOM、SAX、JDOM、DOM4j简单使用介绍】 三、【性能测试】 四、【对比】 五、【小插曲XPath】 六、【补充】 关键字:Java解析xml、解析xml四种方法、DOM、SAX、JDOM、DOM4j、XPath 【引言】 目前在Java中用于解析XML的技术很多,主流的有DOM、SAX、JDOM、DOM4j,下文主要介绍

SMCwwh 8万+

华为OD机试双机位C卷:挑选宝石 (C/C++/Python/JAVA/JS/GO)

华为OD机试双机位C卷 挑选宝石,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试-挑选宝石,华为OD机考-挑选宝石。

qq_45776114的博客 1500

DOM、JDOM、DOM4J解析XML实例

一、DOM方式 原始name.xml 李华 14 张三 16 王娟 18 数据模型Student.java package com.upcgrid.dom; public class Student { private String name; private String sex; pri

shijinupc的专栏 1620

ABAP CDS 视图参数 parameter_list 详解与最佳实践:从语法、作用域到可运行范例

本文系统梳理了ABAP CDS视图的WITH PARAMETERS定义与使用。主要内容包括:1)参数声明语法及其在整条SELECT语句中的贯穿使用;2)参数在WHERE/HAVING/ON等位置的多种写法(:pname和$parameters.pname);3)参数在航空公司航线筛选等实际业务场景中的应用;4)参数与会话变量的协作策略;5)在JOIN ON、HAVING、CASE等高级用法中的实践;6)提供完整的CDS视图与ABAP程序示例,展示参数声明、使用及Open SQL传参方式。所有内容均基于SAP

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 372

RobotFramework二次开发——实时日志

背景基于RobotFramework的二次开发,少不了要打印实时日志出来,比如广泛应用的工具ride中,在执行用例时会把执行过程中的log全部打印出来,如果二次开发的时候,执行用例只能静默等待执行完毕,那只能算是一个半成品。结果在最后,不想看过程的可以直接跳到最后思路RobotFramework的日志有好几种,一个是执行后的log文件,这个文件可以作为数据留存,但是没办法实时获取,因为文件是在执行完

点点寒彬的博客 1万+

DOM、JDOM、DOM4J的区别

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666) dom是解析xml的底层接口之一(另一种是sax) 而jdom和dom4j则是基于底层api的更高级封装 dom是通用的,而jdom和dom4j则是面向java语言的 DOM 是用与平台和语言无关的方式表示 XM...

孤云博客 2292

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

JDom解析xml文件

1.DOM和SAX的不同:      1. DOM是基于内存的,不管文件有多大,都会将所有的内容预先装载到内存中。从而消耗很大的内存空间。而SAX是基于事件的。当某个事件被触发时,才获取相应的XML的部分数据,从而不管XML文件有多大,都只占用了少量的内存空间。      2. DOM可以读取XML也可以向XML文件中插入数据,而SAX却只能对XML进行读取,而不能在文件中插入数据。这也是SA

bingkafei222的博客 340

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

JDOM 解析 XML的常用方法

使用Jdom,操作xml从此变得方便,^_^一、创建XML文件Document doc = new Document(new Element("rootElement"))或者Document doc = new Document();// 根元素Element root = new Element("persons");doc.addContent(root);// add personElem

刘岩的专栏 1544

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

DOM和JDOM解析XML文档

先前用SAX解析了XML文档,今天用DOM和JDOM来解析。首先来说一下DOM,它是文档对象模型,它的特性是定义一组Java接口,基于对象,与语言和平台无关,将XML文档表示成树,在内存中解析和存储XML文档,允许随机访问文档的不同部分。它的优点是可以修改后更新,还可以在任何时候在树中导航,API用起来也简单。下面来看下代码 //XML文档 <?xml version="1.0" enc...

dtbk123的博客 484

Java进阶(五十一)XML 四种解析器(dom,sax,jdom,dom4j)原理及性能比较_java xml解析工具

dom是解析xml的底层接口之一(另一种是sax).而jdom和dom4j则是基于底层api的更高级封装。dom是通用的,具有跨语言、跨平台性,而jdom和dom4j则是面向java语言的。

2501_90253336的博客 1121

Java解析xml——DOM、SAX、JDOM和DOM4J四种方式的汇总与比较

一、四种方式的对比 【DOM】 DOM解析是将xml整个读入内存中,并在内存中以DOM树的形式存储。它是与平台无关的官方解析方式,所以不止在Java平台可以用DOM解析,在其他的平台也可以使用。 -优点: 1、树形结构,直观,易于理解,读取方便,代码易编写。 2、树形结构保存在内存中,容易修改。 -缺点 1、因为DOM是将xml文件整个读入内存中,所以对内存消耗大,在xml文件较大时

记录只为更好地前行 1691

java利用dom/jdom解析XML

xml: <?xml version="1.0" encoding="UTF-8"?> <beans> <bean id="v" class="com.bjsxt.spring.factory.Train"> </bean> </beans> jdom: package com.bjsxt.spring.factor...

qq_42678477的博客 145

xml的Jdom解析过程详解

JDOM与DOM类似,也是一组用于解析XML的API,它本身不是一个解析器,默认的它内置了Apache的Xerces解析器;JDOM与DOM不同的是,DOM是跨语言的一套API,Java世界中有很多DOM的解析器,同样的.Net中也一样内置了DOM的实现,但是JDOM是专门为Java打造的一批API,JDOM采用了Java中的Collection架构来封装集合,是Java爱好者更加熟悉的模式。

coolwzjcool的专栏 2117

xml的四种解析方法 比较 sax,dom,jdom,dom4j

在平时工作中,难免会遇到把 XML 作为数据存储格式。面对目前种类繁多的解决方案,哪个最适合我们呢?在这篇文章中,我对这四种主流方案做一个不完全评测,仅仅针对遍历 XML 这块来测试,因为遍历 XML 是工作中使用最多的(至少我认为)。预 备    测试环境:    AMD 毒龙1.4G OC 1.5G、256M DDR333、Windows2000 Server SP4、Sun JDK 1.4.

coolwzjcool的专栏 1400

解析XML 之JDOM 方法

要使用JDOM 解析xml 需要下载JDOM jar包 ( 下载地址:http://jdom.org/downloads/index.html) JDOM是Jdom是用Java语言读、写、操作XML的新API函数的一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法...

Nico的知识小站 354
上一篇: 用DOM/JDOM解析XML文件
下一篇: 用DOM/JDOM解析XML文件(3)
java008
博客等级 码龄23年 6粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值