`

简单的Java读取xml文件

阅读更多

 


 最近有一个任务是将项目中的一些资源代码转化成是可配置的,因此,心里想到了使用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,word,xml文件(防乱码)

    #### 三、Java读取XML文件 对于XML文件的读取,我们可以采用Java标准库中的`BufferedReader`配合`InputStreamReader`的方式来进行处理。这样可以在读取文件的同时指定正确的字符编码,从而避免乱码问题。 ```java ...

    用java读取xml文件的四种方法

    要读取XML文件,Java提供了多种方法。以下是四种常用的方法,每种都有其适用场景和特点: 1. **DOM解析器(Document Object Model)** DOM解析器将整个XML文件加载到内存中,创建一个树形结构,允许我们通过节点...

    用java读取修改xml文件的代码实现

    本文将详细介绍如何使用Java来读取和修改XML文件,主要涉及以下几个核心知识点: 1. **DOM解析器**: Document Object Model(DOM)是一种将XML文档转换为内存中的树形结构的方法,使得可以遍历和修改XML文件。...

    java读写xml文件

    ### Java读写XML文件知识点详解 #### 一、概述 在Java编程中,对XML文件进行读取与写入是一项非常常见的任务。XML(可扩展标记语言)是一种用于标记数据的语言,非常适合用来存储和传输数据。Java提供了多种API来...

    java读取xml文件

    Java 读取 XML 文件是 Java 开发中常见的一项任务,XML(eXtensible Markup Language)作为一种可扩展标记语言,广泛用于数据交换、配置存储等领域。本教程将深入讲解如何在 Java 中处理 XML 文件,同时涉及 XML 的 ...

    Java读写xml java 读写xml文件操作, 简单易懂

    ### Java读写XML文件操作详解 在现代软件开发中,XML(可扩展标记语言)是一种广泛使用的数据交换格式,尤其在处理配置文件、数据存储以及跨平台数据交换时显得尤为重要。Java提供了多种读写XML文件的方法,包括SAX...

    java读取xml文件生成文件

    Java语言在处理XML文件时,提供了丰富的API和库,使得我们可以轻松地读取、解析、修改和生成XML文档。在给定的场景中,我们主要关注如何使用Java来读取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文件和读取XML文件

    二、Java读取XML文件 1. 使用DOM解析: 读取XML文件时,首先会将整个XML文档加载到内存中的DOM树,然后通过API遍历和访问各个节点。 示例代码: ```java import javax.xml.parsers.DocumentBuilder; import javax....

    java中读写XML文件

    在Java编程语言中,XML(eXtensible Markup Language)是一种重要的数据交换格式,用于存储和...在提供的"在java中读写XML文件.ppt"和"源码"中,可能包含了更多详细的步骤和示例代码,可以帮助你进一步理解这个主题。

    java读写xml文件的方法

    ### Java读写XML文件的方法详解 #### 一、概述 在Java编程中,XML(Extensible Markup Language,可扩展标记语言)是一种广泛使用的数据交换格式。由于其良好的跨平台特性和自描述性,使得XML成为了许多应用程序...

    java读取xml文件并存入数据库

    java从xml中读入数据并存入到sqlserver2005数据库中

    Java读取xml文件的四种方法.doc

    Java 读取 XML 文件的四种方法 在 Java 中读取 XML 文件有多种方法,本文将介绍四种常见的方法,分别使用 DOM、DOM4J、JDOM 和 SAX 解析器。 第一种方法:使用 DOM DOM(Document Object Model)是一种树形结构,...

    使用Java读取XML配置文件

    使用 Java 读取 XML 配置文件 Java 语言和 XML 技术可以说是黄金组合,网上已经有很多文章介绍 XML 在电子商务中的数据交换的作用。但是在平时系统开发中,我们不一定都用到数据交换,是否无法使用 XML?当然不是...

    java读取和写入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文件生成树形图

    在Java编程中,读取XML文件并将其转换为树形结构是一种常见的操作,尤其是在处理配置文件、数据交换或解析XML文档时。以下是一篇详细解释如何实现这一过程的文章。 首先,我们需要了解XML(eXtensible Markup ...

    java读取xml文件导入到mysql数据库中

    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

Global site tag (gtag.js) - Google Analytics