是否可以使用.txt或.xml文件创建带参数的枚举?

时间:2018-02-19 12:16:04

标签: java xml enums

我想使用文件创建一个枚举类。 我希望让维护更容易。

txt示例:

//枚举实例的名称和' - '的名称是参数值:

JOHN-23
ANNA-19

xml示例:

<friends>
    <friend name="JOHN">
        <age>23</age>
    </friend>
    <friend name="ANNA">
        <age>19</age>
    </friend>
</friends>

我想要像这样的枚举:

enum Friends {
    JOHN(23),
    ANNA(19);

    private int age;

    Friends(int age) {
        this.age = age;
    }
}

2 个答案:

答案 0 :(得分:1)

可以通过XSLT转换来执行此操作,并通过构建系统中的任务调用SAXON

e.g。将此应用于您的示例XML将导致您的示例枚举代码

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0">
  <xsl:output method="text" indent="no"/>

  <xsl:variable name="classname"><xsl:sequence select="concat(upper-case(substring(/*/local-name(),1,1)), substring(/*/local-name(), 2), ' '[not(last())])"/>  </xsl:variable>

  <xsl:template match="/*">
    enum <xsl:value-of select="$classname"/>
    {<xsl:for-each select="*"><xsl:if test="position()!=1">,</xsl:if><xsl:text>
        </xsl:text><xsl:value-of select="@name"/>(<xsl:for-each select="*"><xsl:if test="position()!=1">, </xsl:if><xsl:value-of select="text()"/></xsl:for-each>)</xsl:for-each>;

<xsl:for-each select="*[1]/*">        private int <xsl:value-of select="local-name()"/>;
</xsl:for-each><xsl:text> 
        </xsl:text><xsl:value-of select="$classname"/>(<xsl:for-each select="*[1]/*"><xsl:if test="position()!=1">, </xsl:if>int <xsl:value-of select="local-name()"/></xsl:for-each>)
        {
<xsl:for-each select="*[1]/*">            this.<xsl:value-of select="local-name()"/> = <xsl:value-of select="local-name()"/>;
</xsl:for-each>        }
    }
  </xsl:template>
</xsl:stylesheet>

然而,

  • 如果XML对每个枚举值没有相同数量的参数,它将会中断。
  • 您的输入是编码类型名称和字段名称作为元素名称,而元模型更容易将它们编码为属性
  • 更容易为显式而非隐式信息编写变换(即假设你有一个int age参数而不是只是发生了年龄元素,其内容是一个十进制数字字符串)
  • 如果你继续做一些更复杂的事情,比如生成类的层次结构,解决重载和继承的查询会快速通过简单的XSLT

答案 1 :(得分:0)

这是一个如何在java中使用StAX生成枚举的示例:

package codegen;

import java.io.FileWriter;
import java.io.IOException;
import java.net.URL;

import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;

public class GenCode {
    public static void main(String[] args) throws XMLStreamException, IOException {
        URL xmlFile = GenCode.class.getResource("Friends.xml");
        XMLInputFactory inFactory = XMLInputFactory.newFactory();
        XMLStreamReader reader = inFactory.createXMLStreamReader(xmlFile.openStream());

        try (FileWriter out = new FileWriter("generated/codegen/Friends.java")) {
            out.write("package codegen;\n");
            out.write("\n");
            out.write("public enum Friends {\n");

            String friendName = null;
            boolean inAge = false;
            String sep = "\t";
            while (reader.hasNext()) {
                switch (reader.next()) {
                    case XMLStreamReader.START_ELEMENT:
                        if (reader.getLocalName().equals("friend"))
                            friendName = reader.getAttributeValue(null, "name");
                        if (reader.getLocalName().equals("age"))
                            inAge = true;
                        break;
                    case XMLStreamReader.CHARACTERS:
                        if (inAge) {
                            out.write(sep + friendName + "_" + reader.getText());
                            sep = ",\n\t";
                        }
                        break;
                    case XMLStreamReader.END_ELEMENT:
                        if (reader.getLocalName().equals("age"))
                            inAge = false;
                        break;
                }

            }
            out.write("\n}");
        }
    }
}

您可能需要更改一些路径。

您必须编译此文件,使用java调用它,它将使用枚举创建Friends.java,然后编译其余文件。