`
53873039oycg
  • 浏览: 842082 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java应用之使用XML文件生成普通Java文件

    博客分类:
  • java
 
阅读更多

      首先说明,本文所说的XML文件是格式良好的普通XML文件,生成Java是原Java文件不存在从XML文件中生成。内容很简单,本文旨在抛砖引玉,欢迎文明留言交流。

 

      今天一位朋友要我帮忙看下是否有一个工具,给定一个XML文件,生成一个JavaBean文件,并给我一个XML文件作为例子,以前XMl解析用过很多,使用XMl生成Java文件没见过,就自己弄了下,以下是我做的,我的方法是使用工具把XML文件转换为XSD文件,然后使用XJC生成Java文件,有更好的方法的朋友欢迎留言交流。

     以我朋友提供的文件为例:

 

<fault>
			<faultId>10024</groupId>        <!— 故障编号 
           <deviceId>10023</deviceId>      <!— 设备编号  
			<deviceModel>10023</deviceModel>  <!— 设备型号(设备细类ID) 
			<groupId>1098</groupId >          <!— ##### 
			<processStat>1</processStat>		<!— 0:处理中  1:已关单
			<faultDesc>电视机坏</ faultDesc>    <!—故障原因 
			<process>进行更换< process>         <!—处理方法 
			<timeoutReason>超时原因</timeoutReason>      <!—超时原因 
<timeout>1.25</timeout>      <!—超时时长 
<protime>1.25</protime>		<!—处理时长 
<faulttime>2013-05-23 09:53:12</faulttime >		<!—开单时间 
<closetime>2013-05-23 09:53:12</closetime >		<!—关单时间 
</fault>

  

    (一)把XML文件处理为标准XML文件

    可以看出上面的格式不是很良好,处理结果如下:

    

<fault>
			<groupId>10024</groupId>        
            <deviceId>10023</deviceId>      
			<deviceModel>10023</deviceModel> 
			<groupId>1098</groupId >         
			<processStat>1</processStat>	
			<faultDesc>电视机坏</faultDesc> 
			<process>进行更换</process>      
			<timeoutReason>超时原因</timeoutReason> 
            <timeout>1.25</timeout>      
            <protime>1.25</protime>		
            <faulttime>2013-05-23 09:53:12</faulttime >		
            <closetime>2013-05-23 09:53:12</closetime >		
</fault>

  

   (二)XMl文件转换为XSD文件

    这一步使用在线工具完成:

    http://www.freeformatter.com/xsd-generator.html#ad-output

   

    把XMl复制到文本框中,单击生成XSD按钮。

    结果如下:

   

     把XSD复制到文件中。

 

     (三)修改XSD文件

   

    时间类型字段faulttime和closetime修改type为xs:date,把<xs:choice maxOccurs="unbounded" minOccurs="0">修改为 <xs:sequence>,目的生成Java的属性。修改的文件如下:

   

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="fault">
    <xs:complexType>
      <xs:sequence>
        <xs:element type="xs:short" name="groupId"/>
        <xs:element type="xs:short" name="deviceId"/>
        <xs:element type="xs:short" name="deviceModel"/>
        <xs:element type="xs:byte" name="processStat"/>
        <xs:element type="xs:string" name="faultDesc"/>
        <xs:element type="xs:string" name="process"/>
        <xs:element type="xs:string" name="timeoutReason"/>
        <xs:element type="xs:float" name="timeout"/>
        <xs:element type="xs:float" name="protime"/>
        <xs:element type="xs:date" name="faulttime"/>
        <xs:element type="xs:date" name="closetime"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

  

   (四)使用XJC把XSD转换为Java文件

    在命令行下使用xjc -help可以查看xjc参数说明, -d文件目录,必须存在,p包名称  *.xsd当前路径下所有的xsd文件,其他的参数我就不介绍了

    

      使用命令:

     

xjc -d src -p com.test.beans test_xsd.xsd

    生成Java文件,结果如下。

    

 

 

    (五) 去掉JAXB注释

    自己写的一个处理文件类,写的不好请见谅:

     

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class 处理Java文件 {
	public static void main(String[] args) throws Exception {
		处理Java文件 t = new 处理Java文件();
		t.processJavaFile("F:/saveFile/tmp/src/com/test/beans/Fault.java",
				true, "utf-8");
	}

	public void processJavaFile(String inputFile, boolean isProcess,
			String charSet) throws IOException {
		if (charSet == null) {
			charSet = "utf-8";
		}
		File file = new File(inputFile);
		if (!file.exists() || file.isDirectory()) {
			throw new FileNotFoundException();
		}
		BufferedReader br = new BufferedReader(new InputStreamReader(
				new FileInputStream(file), charSet));
		boolean isComment = false;
		boolean isJaxbComment = false;
		String temp = null;
		StringBuilder sb = new StringBuilder();
		while ((temp = br.readLine()) != null) {
			if (temp != null) {
				//干掉单行注释
				if (temp.startsWith("//")
						|| temp.startsWith("import javax.xml.bind.annotation.")) {
					continue;
				} else if (temp.indexOf("/**") != -1) {
					//多行注释开始
					isComment = true;
				} else if (isComment && temp.endsWith("*/")) {
					//多行注释结束
					isComment = false;
					continue;
				}
				// 处理jaxb注释
				// 去掉@带括号或者@不带括号
				temp = new String(temp.replaceAll("\\s*@.+\\(.+\\),?", "")
						.replaceAll("\\s*@[^()]+(\\r|\\n)?$", ""));
				if (temp.trim().length() == 0) {
					continue;
				} else if (temp.indexOf("@") != -1 && temp.indexOf("(") != -1
						&& temp.indexOf(")") == -1) {
					isJaxbComment = true;
					continue;
				}
				//跨行@结束
				if (isJaxbComment && temp.indexOf(")") != -1) {
					isJaxbComment = false;
					continue;
				}
				if (!isComment && !isJaxbComment) {
					if (isProcess) {
						if(temp.indexOf("import javax.xml.datatype.XMLGregorianCalendar;")!=-1)
						{
							//一行一行读取;替换全行
							temp="import java.util.Date;";
						}
						temp = new String(temp
								.replaceAll("protected", "private")
								.replaceAll("short", "int")
								.replaceAll("byte", "int")
								.replaceAll("Byte", "int")
								.replaceAll("Integer", "int"))
						        .replaceAll("XMLGregorianCalendar", "Date");
					}
					sb.append(temp).append("\r\n");
				}
			}
		}
		br.close();
		temp = new String(sb.toString());
		// 把空白换成"",然后使用trim过滤掉。
		temp = new String(temp.replaceAll("\\s+\\r\\n", "\\r\\n"));
		file.delete();
		OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(
				inputFile), charSet);
		out.write(temp);
		out.flush();
		out.close();
	}
}

 

     处理结果如下:

  

  

     缺点:注释不见了。

    有更好方法的朋友欢迎留言交流。

   本文系原创,转载请注明出处。
 

 

 

  • 大小: 144.1 KB
  • 大小: 115.9 KB
  • 大小: 136.1 KB
  • 大小: 76.9 KB
  • 大小: 126.2 KB
  • 大小: 104.6 KB
0
0
分享到:
评论
2 楼 53873039oycg 2014-03-05  
chenhailong 写道
感觉好像很无力。

大部分的工数还是在人工修改上,一点用处都没有。
修改的时间和直接创造的时间基本上相同。

最大期望自动化生成代码

比如wsdlToJava 可以学习一下

抛砖引玉而已,我没有说我这个方法是全自动的,还有这只是针对普通的xml文件,wsdl生成客户端代码有现成的工具,想全自动可以自己解析xml文件生成java文件,其他更好的方法我也不知道。
1 楼 chenhailong 2014-03-05  
感觉好像很无力。

大部分的工数还是在人工修改上,一点用处都没有。
修改的时间和直接创造的时间基本上相同。

最大期望自动化生成代码

比如wsdlToJava 可以学习一下

相关推荐

    java 通过模板生成 xml,发送报文

    在Java编程中,生成XML文件并发送报文是一项常见的任务,尤其在系统间的数据交换、API调用或者网络通信中。XML(eXtensible Markup Language)是一种结构化数据表示语言,具有良好的可读性和可扩展性,是数据传输的...

    java读取xml文件生成文件

    Java语言在处理XML文件时,提供了丰富的API和库,使得我们可以轻松地读取、解析、修改和生成XML文档。在给定的场景中,我们主要关注如何使用Java来读取XML文件并根据需求生成新的文件。以下是关于这个主题的详细说明...

    JAVA 解析XML生成XML文档实例

    JAVA 解析XML和生成XML文档源码。比较全 1.DOM生成和解析XML文档 2.SAX生成和解析XML文档 3.DOM4J生成和解析XML文档 4.JDOM生成和解析XML

    使用java把数据库数据导出生成xml文件

    使用java把数据库数据导出生成xml文件 使用java把数据库数据导出生成xml文件

    java文件生成xml文档

    在Java编程中,生成XML文档是一项常见的任务,特别是在构建配置文件、数据交换或者保存结构化信息时。XML(eXtensible Markup Language)是一种标记语言,它的结构清晰、可读性强,非常适合用来存储和传输数据。...

    java生成xsd,xml示例

    同样,Java也可以反向操作,从XML生成Java对象或XSD。使用Unmarshaller可以将XML数据解析为Java对象,而使用工具如JAXB或XML Schema Tools则可以生成XSD文件。 在提供的压缩包文件`xml_test`中,可能包含了用于演示...

    java XML解析方式实现自动生成word文档

    在Java编程环境中,生成Word文档是一项常见的任务,尤其在企业级应用中,如报告生成、数据分析等场景。XML解析方式是一种高效且灵活的方法,能够帮助我们实现这一目标。本篇文章将详细探讨如何利用Java和XML解析来...

    java_动态生成XML文件

    在Java编程中,生成XML文件是一项常见的任务,特别是在数据存储、配置管理或数据交换的应用场景。XML(eXtensible Markup Language)是一种结构化数据格式,具有良好的可读性和易于解析的特点。本教程将深入讲解如何...

    java操纵xml文件的读写,并根据xml生成树型菜单

    本文将详细介绍如何使用Java进行XML文件的读写操作,并基于读取到的数据生成树型菜单,以方便用户浏览和操作。 #### 二、关键概念解释 1. **XML文件**: 一种结构化数据存储的语言,用于标记电子文档。 2. **DOM ...

    Java解析和生成XML.pdf

    Java解析和生成XML的知识点主要涵盖了使用JAXB(Java Architecture for XML Binding)框架来实现Java对象与XML(可扩展标记语言)之间的数据转换。JAXB提供了一种便捷的方式,通过注解(Annotation)来实现这一过程...

    java中生成xml文件,并上传至ftp服务器

    JAVA中生成xml文件到指定路径和上传到ftp服务器到指定路径的方法。

    使用Java自动生成Java类和XML文件

    本篇将深入探讨如何使用Java来自动生成Java类和XML文件,以及它在实际开发中的应用。 首先,我们要理解Java类和XML文件在软件工程中的角色。Java类是面向对象编程的基础,用于封装数据和行为,构建程序的结构。而...

    JAVA 生成 XML文件

    本篇文章将深入探讨如何使用Java来生成XML文件,并结合数据库操作进行数据提取。 首先,我们需要了解XML的基本结构。XML文件由一系列元素组成,每个元素都有开始标签(如`&lt;element&gt;`)和结束标签(如`&lt;/element&gt;`)...

    xml文件自动转成java对象工具

    2. **生成Java类结构**:根据XSD中的元素和属性,工具自动生成对应的Java类,每个元素变成类的一个字段,属性则作为类的getter和setter方法。 3. **处理复杂类型**:如果XSD中定义了复杂类型,工具会创建相应的Java...

    java生成xml文件的时候如何控制xml的缩进格式.pdf

    java生成xml文件的时候如何控制xml的缩进格式.pdf

    解析xml,生成java类

    2. 如果XML结构固定且复杂,使用XSD文件生成Java类可以减少手动编码的工作量,也有助于保持代码与XML结构的一致性。 3. 在处理XML文件时,注意处理可能的编码问题,确保读写时使用正确的字符集。 4. 为提高性能,...

    java 读取xml文件生成树形图

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

    java生成xml文件

    用java生成xml文档.DocumentBuilderFactory DocumentBuilder Document doc;至此可以用doc来操作xml文档了

    JAVA生成XML文件.doc

    本文档通过一个具体的示例介绍了如何使用Java语言来生成XML文件,并对代码进行了详细的解析。 #### 二、核心库与依赖 本示例使用了`org.jdom`库来处理XML的生成。JDOM(Java Document Object Model)是一个用于...

Global site tag (gtag.js) - Google Analytics