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

标签 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;
    }
}

最佳答案

可以通过 XSLT 转换来完成此操作并调用 SAXON通过构建系统中的任务。

例如将其应用到示例 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 参数,而不是恰好有内容为十进制数字字符串的 Age 元素)
  • 如果您继续处理更复杂的事情,例如生成类的层次结构,则解决重载和继承的查询会快速超越简单的 XSLT

关于java - 是否可以使用 .txt 或 .xml 文件创建带有参数的枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48866043/

相关文章:

java - Mysql通过Java可调用语句插入转义字符\也在数据库中

java - Spring @SessionAttributes 返回 null

java - 使用 super 将变量提升为抽象父类(super class)是否比在子类中分配它有好处?

java - JSQLParser 凝胶查询和子查询中的所有选择项

java - 如何以编程方式更新具有序列的复杂类型并将其添加到 XSD

当节点内部文本为html时,Java解析xml文件

java - 如何将 HTML 字符串转换为 XML DOM

java - 在构造函数中初始化枚举变量

c# - 查找枚举中的最大值

java - 如何检测新值已添加到枚举中,但未在开关中处理