通过Java枚举值填充XML-File中的属性值

时间:2017-02-03 10:33:25

标签: java xml enums

我有几个xml文件,后来用java / gwt定义了我的GUI表示。 例如:

<?xml version="1.0" encoding="UTF-8"?>
    <master>
        <search-field>ExternalIdentifier</search-field>
        <search-field>Name</search-field>
        <attribute allowDisableSearchId="MasterExternalIdentifier">ExternalIdentifier</attribute>
        <attribute allowDisableSearchId="MasterName">Name</attribute>
    </master>

在这种特殊情况下,我想让用户选择通过复选框来取消/激活对特定列的搜索。为了识别这些字段,我想给它们一个唯一的标识符(这里有属性allowDisableSearchId)。使用此ID,可以预选(甚至不选择)此复选框。

问题是,当我设置我可能会监督的名称时,唯一的名称已经在其他文件中提供了。 除此之外,如果我想概述存在哪些唯一ID(例如设置首选项),我需要搜索所有xml文件以获取此属性。

现在,我想知道是否有像我在java中定义枚举这样的技术,并通过枚举值设置值。 例如,枚举:

public enum ALLOWDISABLESEARCHID {
  MasterExternalIdentifier,
  MasterName
}

然后在xml中使用

<?xml version="1.0" encoding="UTF-8"?>
    <master>
        <search-field>ExternalIdentifier</search-field>
        <search-field>Name</search-field>
        <attribute allowDisableSearchId="ALLOWDISABLESEARCHID.MasterExternalIdentifier">ExternalIdentifier</attribute>
        <attribute allowDisableSearchId="ALLOWDISABLESEARCHID.MasterName">Name</attribute>
    </master>

有了这个,我可以肯定它是唯一的,以后可以在java代码中引用它们。

或者我可以使用其他一些技术吗?

1 个答案:

答案 0 :(得分:1)

enum的想法不会断言唯一性。我会写一个Test,它读取/src/main/resources/.../下的每个xml并解析所有属性值。 当'allowDisableSearchId'被多次使用时,测试应抛出异常。

package stackoverflow;

import static java.util.Arrays.asList;
import static java.util.Collections.singletonList;

import java.io.InputStream;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.junit.Test;

public class FindDuplicateId
{
    @Test
    public void idsAreUnique() throws Exception
    {
        final Set<String> ids = new HashSet<>();
        for (final InputStream xml : findAllXml())
        {
            for (final String id : readIds(xml))
            {
                if (!ids.add(id))
                {
                    throw new IllegalStateException("Duplicate ID " + id);
                }
            }
        }
    }

    List<InputStream> findAllXml()
    {
        // TODO implement correct
        return singletonList(this.getClass()
                                 .getResourceAsStream("a.xml"));
    }

    List<String> readIds(final InputStream xml)
    {
        // TODO implement correct
        return asList("MasterExternalIdentifier", "MasterName", "MasterExternalIdentifier");
    }
}