最近有一个任务是将项目中的一些资源代码转化成是可配置的,因此,心里想到了使用XML文件来配置,虽然最后使用了properties来配置,但是突然想自己读取一把xml文件,并且不借助jdom之类的jar包来解析
想到xml配置文件是一个循环结构,因此最开始想使用递归方法,但是到后来觉得递归找子项不太好找(不想记录尖括号位置那种写法),后来觉得用数据结构里面建立树的写法来建立"xml 树",我觉得这种思路是对的,因为即使是html标准的文档也会使用domtree的概念,而且一些解析xml的jar 包最后得到的也是近似是树的结构。
我只是做了一个很小的测试,今天北京雾霾特别大,头昏脑涨的,也就没有考虑过多复杂的情形,以下面的xml为例做测试
<school> <colleage> <student> <name>luchi</name> <sex>male</sex> </student> <student> <name>lushuiye</name> <sex>female</sex> </student> <student> <name>zhangsan</name> <sex>male</sex> </student> </colleage> <gate> <color>red</color> <text>welcome to graduate school</text> </gate> </school>
我把每个尖括号都看作是一个类(等同于C语言的结构体),有其属性,特别是有parent和child这两个属性,类如下:
package test; import java.util.HashSet; import java.util.Set; public class Node { private String name; private String value; private Set<Node> child=new HashSet<Node>(); private Node parent=null; public Node getParent() { return parent; } public void setParent(Node parent) { this.parent = parent; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } public Set<Node> getChild() { return child; } public void setChild(Set<Node> child) { this.child = child; } }
把类的对象看作是树的节点,有子女和孩子,我的处理逻辑是读取标签,如果遇到<>标签就简历一个新的树节点,如果遇到文本则更新当前节点的属性值,如果遇到结束标签,则将当前节点设置成当前节点的父节点(退一个节点),然后继续扫面文档,直到文档结束
具体代码如下
package test; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; public class ReadXML { String path="C:\\Users\\dell\\Desktop\\test.xml"; String text=""; //根节点 Node root=new Node(); //设置当前节点为空,当前节点就是这棵树最新构造的节点 Node currentNode=null; //读取内容并解析 public void parse() throws IOException{ File xmlFile=new File(path); InputStream in=new FileInputStream(xmlFile); int len; byte []buff=new byte[1024]; while((len=in.read(buff))>0){ text+=new String(buff); } root.setParent(null); parseText(root,text); } /*解析的主要方法 * * @param root 传入的根节点 * @param text 传入的文本 * @author luchi */ private void parseText(Node root,String text) { currentNode=root; //看是不是第一次构造根节点 boolean isFirst=true; while(!text.trim().equals("")){ //处理开始标签 if(text.startsWith("<")&& !text.startsWith("</")){ int head_begin=text.indexOf("<"); int head_end=text.indexOf(">"); String name=text.substring(head_begin+1,head_end); if(currentNode.getParent()==null && isFirst){ currentNode.setName(name); isFirst=false; }else{ Node child=new Node(); child.setName(name); child.setParent(currentNode); currentNode.getChild().add(child); currentNode=child; // System.out.println(" "+currentNode.getName()); } text=text.substring(head_end+1).trim(); continue; }else if(!text.startsWith("</") && !text.startsWith("<")){ //处理正文属性标签 int head_begin=text.indexOf("</"); String value=text.substring(0,head_begin).trim(); currentNode.setValue(value); text=text.substring(head_begin).trim(); continue; }else if(text.startsWith("</")){ //处理结尾标签,回溯节点 Node temp=currentNode.getParent(); if(temp!=null){ currentNode=temp; } int end_end=text.indexOf(">"); text=text.substring(end_end+1).trim(); continue; } } } public void printGivenNumBlank(int blank){ for(int i=0;i<blank;i++){ System.out.print(" "); } } //深度遍历结果 public void show(Node srcNode,int blank){ if(srcNode!=null){ printGivenNumBlank(blank); System.out.print(srcNode.getName()); if(srcNode.getValue()!=null && !srcNode.getValue().equals("")){ System.out.print(" "+srcNode.getValue()); } System.out.println(); for(Node child:srcNode.getChild()){ show(child,blank*2); } } } public void result(){ show(root,5); } }
代码注释差不多写清楚了,最后我们来看一下测试程序
@Test public void testXML() throws IOException { ReadXML parser=new ReadXML(); parser.parse(); parser.result(); }
以及该结果
school gate text welcome to graduate school color red colleage student sex male name zhangsan student name luchi sex male student sex female name lushuiye
如图所示打印出了一个横过来的xml树,说明处理成功,今天人比较疲倦,逻辑比较简单,也没有涉及到复杂的xml格式等情况,就到这里,over!
相关推荐
#### 三、Java读取XML文件 对于XML文件的读取,我们可以采用Java标准库中的`BufferedReader`配合`InputStreamReader`的方式来进行处理。这样可以在读取文件的同时指定正确的字符编码,从而避免乱码问题。 ```java ...
要读取XML文件,Java提供了多种方法。以下是四种常用的方法,每种都有其适用场景和特点: 1. **DOM解析器(Document Object Model)** DOM解析器将整个XML文件加载到内存中,创建一个树形结构,允许我们通过节点...
本文将详细介绍如何使用Java来读取和修改XML文件,主要涉及以下几个核心知识点: 1. **DOM解析器**: Document Object Model(DOM)是一种将XML文档转换为内存中的树形结构的方法,使得可以遍历和修改XML文件。...
### Java读写XML文件知识点详解 #### 一、概述 在Java编程中,对XML文件进行读取与写入是一项非常常见的任务。XML(可扩展标记语言)是一种用于标记数据的语言,非常适合用来存储和传输数据。Java提供了多种API来...
Java 读取 XML 文件是 Java 开发中常见的一项任务,XML(eXtensible Markup Language)作为一种可扩展标记语言,广泛用于数据交换、配置存储等领域。本教程将深入讲解如何在 Java 中处理 XML 文件,同时涉及 XML 的 ...
### Java读写XML文件操作详解 在现代软件开发中,XML(可扩展标记语言)是一种广泛使用的数据交换格式,尤其在处理配置文件、数据存储以及跨平台数据交换时显得尤为重要。Java提供了多种读写XML文件的方法,包括SAX...
Java语言在处理XML文件时,提供了丰富的API和库,使得我们可以轻松地读取、解析、修改和生成XML文档。在给定的场景中,我们主要关注如何使用Java来读取XML文件并根据需求生成新的文件。以下是关于这个主题的详细说明...
下面是一个简单的Java读取XML的StAX示例: ```java import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamReader; import java.io....
二、Java读取XML文件 1. 使用DOM解析: 读取XML文件时,首先会将整个XML文档加载到内存中的DOM树,然后通过API遍历和访问各个节点。 示例代码: ```java import javax.xml.parsers.DocumentBuilder; import javax....
在Java编程语言中,XML(eXtensible Markup Language)是一种重要的数据交换格式,用于存储和...在提供的"在java中读写XML文件.ppt"和"源码"中,可能包含了更多详细的步骤和示例代码,可以帮助你进一步理解这个主题。
### Java读写XML文件的方法详解 #### 一、概述 在Java编程中,XML(Extensible Markup Language,可扩展标记语言)是一种广泛使用的数据交换格式。由于其良好的跨平台特性和自描述性,使得XML成为了许多应用程序...
java从xml中读入数据并存入到sqlserver2005数据库中
Java 读取 XML 文件的四种方法 在 Java 中读取 XML 文件有多种方法,本文将介绍四种常见的方法,分别使用 DOM、DOM4J、JDOM 和 SAX 解析器。 第一种方法:使用 DOM DOM(Document Object Model)是一种树形结构,...
使用 Java 读取 XML 配置文件 Java 语言和 XML 技术可以说是黄金组合,网上已经有很多文章介绍 XML 在电子商务中的数据交换的作用。但是在平时系统开发中,我们不一定都用到数据交换,是否无法使用 XML?当然不是...
在Java中,处理XML文件主要有四种方式:DOM(Document Object Model)、SAX(Simple API for XML)、StAX(Streaming API for XML)以及JAXB(Java Architecture for XML Binding)。下面将详细介绍这四种方法。 1....
在Java编程中,读取XML文件并将其转换为树形结构是一种常见的操作,尤其是在处理配置文件、数据交换或解析XML文档时。以下是一篇详细解释如何实现这一过程的文章。 首先,我们需要了解XML(eXtensible Markup ...
xml文件导入到mysql数据库中,包括文件:ConnectionUtils.java,InsertDT.java,db_mysql.properties,test01.xml,需要的jar包dom4j-1.6.1.jar,mysql-connection-java-3.1.1.3-bin.jar,jaxen-1.1-beta-7.jar