从没有任何API的XML文件生成java文件 [英] Generate java file from XML file without any API
本文介绍了从没有任何API的XML文件生成java文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我的XML文件:源
< class name =person>
< Attribut type =int> Age< / Attribut>
< Attribut type =String> Name< / Attribut>
< / class>
到java文件:
public class person {
int age;
字符串名称;
}
您的帮助非常赞赏
谢谢
解决方案
如果您还想自己做。您可能会看到这个简化的例子。
首先警告:
- 它缺少适当的异常处理
- 它只适用于您提出的XML示例
示例代码
import java.io.FileInputStream;
import java.io.IOException;
import javax.xml.stream.FactoryConfigurationError;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
public class XMLStreamReaderDemo {
public static void main(String [] args)throws Exception {
String xmlFileName =source.xml;
StringBuilder javaSource = transform(xmlFileName);
System.out.println(javaSource);
}
static StringBuilder transform(String xmlFileName)throws
FactoryConfigurationError,IOException,XMLStreamException {
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader parser = null;
StringBuilder source = new StringBuilder();
try(FileInputStream inputStream = new FileInputStream(xmlFileName)){
parser = factory.createXMLStreamReader(inputStream);
while(parser.hasNext()){
switch(parser.getEventType()){
case XMLStreamConstants.START_ELEMENT:
processStartElement(parser,source);
break;
case XMLStreamConstants.CHARACTERS:
processCharacters(parser,source);
break;
case XMLStreamConstants.END_ELEMENT:
processEndElement(parser,source);
break;
默认值:
break;
}
parser.next();
}
} finally {
if(parser!= null){
parser.close();
}
}
返回源;
}
static void processEndElement(XMLStreamReader reader,StringBuilder sb){
String element = reader.getLocalName();
if(class.equals(element)){
sb.append(});
} else if(Attribut.equals(element)){
sb.append(; \\\
);
}
}
static void processCharacters(XMLStreamReader reader,StringBuilder sb){
if(!reader.isWhiteSpace()){
sb.append ().append(reader.getText());
}
}
static void processStartElement(XMLStreamReader reader,StringBuilder sb){
String element = reader.getLocalName();
if(class.equals(element)){
sb.append(public class)
.append(reader.getAttributeValue(0))
.append {\\\
);
} else if(Attribut.equals(element)){
sb.append()
.append(reader.getAttributeValue(0));
}
}
}
假设 source.xml
包含
< class name =person>
< Attribut type =int> Age< / Attribut>
< Attribut type =String> Name< / Attribut>
< / class>
代码打印
public class person {
int Age;
字符串名称;
}
剩下的唯一的事情:实现所有缺少的部分。如果这仍然包含太多XML API ...好...写你自己的解析器。 ; - )
How can I generate Java file, means generate name of classes methods attributes, without using any API from XML
my XML file : Source
<class name="person">
<Attribut type="int">Age</Attribut>
<Attribut type="String">Name</Attribut>
</class>
to java file:
public class person {
int age;
String Name;
}
Your help is very appreciated
Thank you
解决方案
If you still want to do it your own. You might have a look on this simplified example.
Warnings first:
- it lacks proper Exception handling
- it is build only to work with your proposed XML example
The sample code
import java.io.FileInputStream;
import java.io.IOException;
import javax.xml.stream.FactoryConfigurationError;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
public class XMLStreamReaderDemo {
public static void main(String[] args) throws Exception {
String xmlFileName = "source.xml";
StringBuilder javaSource = transform(xmlFileName);
System.out.println(javaSource);
}
static StringBuilder transform(String xmlFileName) throws
FactoryConfigurationError, IOException, XMLStreamException {
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader parser = null;
StringBuilder source = new StringBuilder();
try (FileInputStream inputStream = new FileInputStream(xmlFileName)) {
parser = factory.createXMLStreamReader(inputStream);
while (parser.hasNext()) {
switch (parser.getEventType()) {
case XMLStreamConstants.START_ELEMENT:
processStartElement(parser, source);
break;
case XMLStreamConstants.CHARACTERS:
processCharacters(parser, source);
break;
case XMLStreamConstants.END_ELEMENT:
processEndElement(parser, source);
break;
default:
break;
}
parser.next();
}
} finally {
if (parser != null) {
parser.close();
}
}
return source;
}
static void processEndElement(XMLStreamReader reader, StringBuilder sb) {
String element = reader.getLocalName();
if ("class".equals(element)) {
sb.append("}");
} else if ("Attribut".equals(element)) {
sb.append(";\n");
}
}
static void processCharacters(XMLStreamReader reader, StringBuilder sb) {
if (!reader.isWhiteSpace()) {
sb.append(" ").append(reader.getText());
}
}
static void processStartElement(XMLStreamReader reader, StringBuilder sb) {
String element = reader.getLocalName();
if ("class".equals(element)) {
sb.append("public class ")
.append(reader.getAttributeValue(0))
.append(" {\n");
} else if ("Attribut".equals(element)) {
sb.append(" ")
.append(reader.getAttributeValue(0));
}
}
}
Assuming source.xml
contains
<class name="person">
<Attribut type="int">Age</Attribut>
<Attribut type="String">Name</Attribut>
</class>
the code prints
public class person {
int Age;
String Name;
}
The "only" thing left for you to do: implement all the missing parts. If this still contains "too much" XML API ... well ... write you own parser. ;-)
这篇关于从没有任何API的XML文件生成java文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文