不使用任何API从XML文件生成java文件

不使用任何API从XML文件生成java文件,java,xml,dynamic,xml-parsing,Java,Xml,Dynamic,Xml Parsing,如何生成Java文件,即生成类名方法属性,而不使用XML中的任何API 我的XML文件:源 <class name="person"> <Attribut type="int">Age</Attribut> <Attribut type="String">Name</Attribut> </class> 非常感谢你的帮助 谢谢您可以从xsd或xml文件生成java类,而无需使用任何java代码或类文件,使用jaxb或位于

如何生成Java文件,即生成类名方法属性,而不使用XML中的任何API

我的XML文件:源

<class name="person">

<Attribut type="int">Age</Attribut>
<Attribut type="String">Name</Attribut>
</class>
非常感谢你的帮助


谢谢

您可以从
xsd或xml
文件生成java类,而无需使用任何java代码或类文件,使用jaxb或位于jdk bin文件夹xjc.exe中的java提供的默认exe文件


如果您仍想自己完成,请访问

上的文档。您可以看看这个简化的示例

首先警告:

  • 它缺乏适当的异常处理
  • 它的构建只是为了使用您提出的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;
                    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));
        }
    }
}
假设
source.xml
包含

<class name="person">
<Attribut type="int">Age</Attribut>
<Attribut type="String">Name</Attribut>
</class>

剩下的“唯一”任务是:实现所有缺失的部分。如果这仍然包含“太多”XML API。。。好。。。编写自己的解析器。;-)

请提供一个
source
示例,解释您尝试执行的操作。如果您不想使用任何XML API(例如),则需要自己编写解析器。你为什么要这么做?正如您所说的,您不想使用JAXB。为什么不至少使用SAX?这是错误的!JAXB可用于从XML模式文档生成Java代码,而不是从任何XML生成。很高兴看到
xjc
如何从提供的XML输入构建Java源代码。但是没有api JAXB,只有Java!
<class name="person">
<Attribut type="int">Age</Attribut>
<Attribut type="String">Name</Attribut>
</class>
public class person {
    int Age;
    String Name;
}