nullITeye - 千亿集团

nullITeye

2019年03月06日11时23分29秒 | 作者: 振国 | 标签: | 浏览: 1763

      首要阐明,本文所说的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();
}

 

     处理成果如下:

  

  

     缺陷:注释不见了。

    有更好办法的朋友欢迎留言沟通。

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

 

 

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表千亿集团立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章