Java中利用simpleFramework解析xml

本文介绍如何使用SimpleXML库解析复杂的XML数据。通过构建特定的Java类来映射XML结构,并提供示例代码演示如何从XML文件中提取学生记录信息。

声明:本文为原创,欢迎转载,转载请注明出处。


simple的主页在http://simple.sourceforge.net/home.php

利用它可以方便的解析xml. 主要思路是先根据要解析的XML构建一个类,然后通过这个类去取xml里面具体的值域。

以下是一个简单的例子,学生记录里有年级,学号,姓名,性别等信息,现在通过simple xml把信息解出来。

<?xml version="1.0" encoding="UTF-8"?>
<StudentRecords>
  <list name="grade1">
	<entry id="1">
		<name>John</name>
		<gender>Boy</gender>
	</entry>
	<entry id="2">
		<name>Joe</name>
		<gender>Girl</gender>
	</entry>
  </list>
  <list name="grade2">
	<entry id="1">
		<name>Bill</name>
		<gender>Boy</gender>
	</entry>
  </list>
</StudentRecords>

首先在工程属性中把simple的jar加到Java Build Path的Libraries里面。这里用的是simple-xml-2.3.4.jar

构建的类具体如下,SunStudent是总类,里面有每个年级列表的集合;SunList是每个年级学生的列表,包含了一个学生集合;SunEntry是每个学生的信息类。

import java.util.ArrayList;
import java.util.List;

import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Namespace;
import org.simpleframework.xml.Root;


@Root(name = "StudentRecords", strict=false)
@Namespace(reference = "urn:sun:params:xml:ns:students")
public class SunStudent {

	@ElementList(inline=true, required=false)
	protected List<SunList> list;
	    
	public List<SunList> getList() {
	    if (list == null) {
	        list = new ArrayList<SunList>();
	    }
	    return this.list;
    }
}

import java.util.ArrayList;

import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Namespace;
import org.simpleframework.xml.Root;


@Root(name = "list", strict=false)
@Namespace(reference = "urn:sun:params:xml:ns:students")
public class SunList {

    @ElementList(inline=true, required=false)
    protected java.util.List<SunEntry> entries;
    @Attribute(required=true)
    protected String name;
   
   
    public String getName() {
        return name;
    }
   
    public void setName(String value) {
        this.name = value;
    }
   
    public java.util.List<SunEntry> getEntries(){
    	if(this.entries == null){
    		this.entries = new ArrayList<SunEntry>();
    	}
    	return this.entries;
    }

}

import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.Namespace;
import org.simpleframework.xml.Root;

@Root(name="entry", strict=false)
@Namespace(reference = "urn:sun:params:xml:ns:students")
public class SunEntry {

    @Element(name = "name", required = true)
    protected String studentName;
    @Element(name = "gender", required = true)
    protected String studentGender;
    @Attribute(required = true)
    protected String id;

    public String getStudentID() {
        return id;
    }
    
    public void setstudentID(String value) {
        this.id = value;
    }
    
    public String getStudentName() {
        return studentName;
    }
    
    public void setstudentName(String value) {
        this.studentName = value;
    }

    public String getStudentGender() {
        return studentGender;
    }
    
    public void setstudentGender(String value) {
        this.studentGender = value;
    }
    
}

测试代码如下:

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader; 
import java.util.List;

import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;

public class SunTest {  

	public static void main(String[] args) throws IOException { 
		String result = "";
		BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\sun.xml")));
		String tmpStr = "";
		final Serializer serializer;
		serializer = new Persister();
		
		while ((tmpStr = br.readLine())!=null){
			result = result + tmpStr.trim();
		}
		System.out.print("the xml file is: " + result + "\n");
		try {
			SunStudent studentRecords = serializer.read(SunStudent.class, new String(result));
			List<SunList> gradeList = studentRecords.getList();
			for (int gradeNo = 0; gradeNo < gradeList.size(); gradeNo++){
				SunList eachList = (SunList)(gradeList.get(gradeNo));
				List<SunEntry> entries = eachList.getEntries();
				System.out.print("\n" + "student Grade: " + eachList.getName() + "\n");
				for (int studentID = 0; studentID < entries.size(); studentID ++){
					SunEntry eachEntry = (SunEntry)(entries.get(studentID));
					System.out.print("student ID: " + eachEntry.getStudentID() + "\n");
					System.out.print("student Name: " + eachEntry.getStudentName() + "\n");
					System.out.print("student Gender: " + eachEntry.getStudentGender() + "\n");
				}
			}
		}
		catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

打印结果如下:

the xml file is: <?xml version="1.0" encoding="UTF-8"?><StudentRecords><list name="grade1"><entry id="1"><name>John</name><gender>Boy</gender></entry><entry id="2"><name>Joe</name><gender>Girl</gender></entry></list><list name="grade2"><entry id="1"><name>Bill</name><gender>Boy</gender></entry></list></StudentRecords>

student Grade: grade1
student ID: 1
student Name: John
student Gender: Boy
student ID: 2
student Name: Joe
student Gender: Girl

student Grade: grade2
student ID: 1
student Name: Bill
student Gender: Boy



`org/simpleframework/xml/strategy/Strategy` 是 Simple Framework XML 库中的一个接口,用于定义 XML 序列化和反序列化的策略。Simple Framework XML 是一个轻量级的 Java 库,用于简化 XML 数据的处理,允许开发者通过注解的方式将 Java 对象与 XML 文档进行相互转换,而 `Strategy` 接口可以定制这个转换过程,例如处理多态类型、自定义元素命名等。 MinIO 是一个高性能的对象存储服务,兼容 Amazon S3 云存储服务 API,常用于存储和管理大量非结构化数据,如图片、视频、日志文件等。 #### 两者的使用场景 - **`org/simpleframework/xml/strategy/Strategy` 的使用**:当需要对 XML 序列化和反序列化进行更精细的控制时会使用 `Strategy`。例如,在处理具有继承关系的 Java 类时,默认的序列化可能无法正确识别具体的子类类型,这时可以通过实现 `Strategy` 接口来指定如何在 XML 中表示和恢复这些子类信息。 ```java import org.simpleframework.xml.strategy.Strategy; import org.simpleframework.xml.strategy.TreeStrategy; import org.simpleframework.xml.stream.Format; import org.simpleframework.xml.core.Persister; // 创建一个自定义的 Strategy 实例 Strategy strategy = new TreeStrategy(); Format format = new Format(); Persister persister = new Persister(strategy, format); ``` - **MinIO 的使用**:MinIO 主要用于文件的存储和管理。可以通过 MinIO 的 Java 客户端 SDK 来实现文件的上传、下载、删除等操作。 ```java import io.minio.MinioClient; import io.minio.PutObjectArgs; // 创建 MinIO 客户端 MinioClient minioClient = MinioClient.builder() .endpoint("https://play.min.io") .credentials("minioadmin", "minioadmin") .build(); // 上传文件 minioClient.putObject( PutObjectArgs.builder() .bucket("my-bucketname") .object("my-objectname") .filename("/path/to/my/file") .build()); ``` #### 两者的关联 一般情况下,`org/simpleframework/xml/strategy/Strategy` 和 MinIO 没有直接的关联。但在某些复杂的应用场景中,可能会同时使用到这两者。例如,在一个需要将数据以 XML 格式存储到 MinIO 中的应用里,就会涉及到使用 Simple Framework XML 库进行 XML 序列化,可能会用到 `Strategy` 来定制序列化策略,然后将生成的 XML 文件上传到 MinIO 中。 #### 可能遇到的问题及解决方法 - **XML 序列化问题**:在使用 `Strategy` 进行 XML 序列化时,可能会遇到类型转换错误或 XML 结构不符合预期的问题。解决方法是仔细检查 `Strategy` 的实现逻辑,确保它正确处理了所有可能的类型和属性。 - **MinIO 连接问题**:在使用 MinIO 客户端时,可能会遇到连接失败的问题。这可能是由于网络问题、凭证错误或 MinIO 服务未启动等原因导致的。可以检查网络连接、验证凭证信息,并确保 MinIO 服务正常运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值