如何通过解析仅包含数据成员名称及其数据类型的xml来在运行时创建java类?

时间:2017-07-19 14:29:31

标签: java xml

XML:

<data_format>
    <data_length>15</data_length> <!-- -1 for unknown -->
    <start_charater>$</start_charater>
    <end_character1>B</end_character1>
    <end_character2>E</end_character2>
    <no_of_parameter>2</no_of_parameter>
    <parameter>
        <start_charater>A</start_charater>
        <data_name>Azimuth</data_name>
        <data_type>char</data_type>
        <size>5</size>
    </parameter>
    <parameter>
        <start_charater>R</start_charater>
        <data_name>Range</data_name>
        <data_type>char</data_type>
        <size>5</size>
    </parameter>
</data_format>

我应该如何将以XML编码的信息转换为可以包含此结构的类?我需要在运行时完成此操作。我从通过某个端口接收的数据包中获取方位角和范围的数据,并且需要一个结构来保存那些我不想硬编码的数据,但是想要在解析XML时在运行时生成它。这样做的目的是增加我的应用程序的通用性。

示例:

<!-- for this xml -->
  <data>
    <data_member name="name" type="String"></data_member>
    <data_member name="id" type="int"></data_member>
  </data>

我想要的Java类是:

class Data
  {
     private String name;
     private int id;
     public String getName()
      {
        return name;
      }
      public void setName(name)
      {
        this.name=name;
      }
      public int getId()
      {
        return id;
      }
      public void setId(id)
      {
        this.id=id;
      }
}

2 个答案:

答案 0 :(得分:2)

让您自己头疼:手动创建POJO,并使用JAXB将相关的XML文件处理到POJO实例中。有关示例和参考链接,请参阅this question

答案 1 :(得分:0)

让我们从第二个XML示例开始,这个示例与第一个示例有很多不同......

这里又是(在编辑的情况下,我向XML添加了值):

<data>
    <data_member name="name" type="String">foo</data_member>
    <data_member name="id" type="int">42</data_member>
</data>

正如RealSkeptic在评论中提到的,您可以使用地图:

import java.util.HashMap;
import java.util.Map;

public class DataHolder {

    private Map<String, Integer> ints = new HashMap<>();
    private Map<String, String> strings = new HashMap<>();

    public int getInt(String fieldName) {
        return ints.get(fieldName);
    }

    public void setInt(String fieldName, int value) {
        ints.put(fieldName, value);
    }

    public String getString(String fieldName) {
        return strings.get(fieldName);
    }

    public void setString(String fieldName, String value) {
        strings.put(fieldName, value);
    }

}

我强烈建议只使用一些众所周知的类型:primitives + String似乎是合理的开始。不要使用Object,使用它总是很痛苦,在某些时候我需要将它转换为特定的东西。

但是如果我是你的API的用户,我会创建包装类以更方便的方式使用它:

public class DataHolderNameAndIdWrapper {

    private DataHolder dataHolder;

    public void setDataHolder(DataHolder dataHolder) {
        this.dataHolder = dataHolder;
    }

    public String getName() {
        return dataHolder.getString("name");
    }
    public void setName(String name) {
        dataHolder.setString("name", name);
    }
    public Integer getId() {
        return dataHolder.getInt("id");
    }
    public void setId(Integer id) {
        dataHolder.setInt("id", id);
    }

}

因为我作为消费者,我想知道我在做什么,而且我个人不同意你的评论“人们可以创建一个比编码更容易的XML”,如你所见,讨论时间更长,然后正确实施......

还有一些问题

  • 您希望名称区分大小写吗?
  • 如果未设置会怎样?

虽然java区分大小写,但对于上面的用法我会将字段名称转换为小写。如果不存在,地图将返回空值。我再次返回空字符串""或0。