Java 将包含不同数据值的小XML转换为POJO

Java 将包含不同数据值的小XML转换为POJO,java,xml,Java,Xml,我目前正在为一个简单的XML编写解析器。XML最长包含18行。我试图解析它并将其转换为POJO。我知道我可以使用JAXB或类似的库,但我觉得考虑到XML的大小,这太过分了。此外,这是一个超越图书馆思考的练习 XML示例如下: <machineinfo> <processorCount>4</processorCount> <boughtDate>2014-06-09 23:17:49.0</boughtDate>

我目前正在为一个简单的XML编写解析器。XML最长包含18行。我试图解析它并将其转换为POJO。我知道我可以使用JAXB或类似的库,但我觉得考虑到XML的大小,这太过分了。此外,这是一个超越图书馆思考的练习

XML示例如下:

<machineinfo>
    <processorCount>4</processorCount>
    <boughtDate>2014-06-09 23:17:49.0</boughtDate>
    <installationStatus>COMPLETE</installationStatus>
    <machineType>BASIC</machineType>
    <osVersion>1849AB48DOED</osVersion>
    <serverName>fjv920dk</serverName>
    <machineStatus>UP</machineStatus>
    <statusPay1>NA</statusPay1>
    <statusPay2>NA</statusPay2>
    <errorCode>NO_ERROR</errorCode>
    <exceptionCode>0</exceptionCode>
    <isCloneable>true</isCloneable>
    <latestVersion>1849AB48DOED</latestVersion>
    <mastermachineName/>
    <podName>8D2</podName>
    <machineName>machine2</machineName>
</machineinfo>
如您所见,这会导致多个
if
条件。我尝试通过使用
地图来简化它,如下所示:

if (tagName.equalsIgnoreCase("processorCount")) {
    machineInfo.setProcessorCount(new Integer(data).intValue());
} else if (tagName.equalsIgnoreCase("boughtDate")) {
    DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS");
    DateTime dt = formatter.parseDateTime(data);
    machineInfo.setBoughtDate(dt);
} else if (tagName.equalsIgnoreCase("installationStatus") {
    machineInfo.setInstallationStatus(InstallationStatus.valueOf(data));
} else if (tagName.equalsIgnoreCase("installationStatus") {
    machineInfo.setInstallationStatus(InstallationStatus.valueOf(data));
}
Map <String, Object> map = new HashMap<String, Object>();
map.put("machineName", data);
map.put("machineType", data);
String mapValue = (String) map.get(tagName);
Map Map=newhashmap();
地图放置(“机器名称”,数据);
map.put(“machineType”,数据);
字符串mapValue=(字符串)map.get(标记名);

但是如何确定应该调用
machineInfo
中的哪个setter呢

您应该使用Java反射或Java Beans API来实现这一点

我喜欢使用
PropertyDescriptor
调用动态设置器:

Method writerMethod = new PropertyDescriptor(fieldName, MachineInfo.class).getWriteMethod();
writerMethod.invoke(machineInstance, fieldValue);

问候,,
布鲁诺

我通过使用以下代码片段解决了这个问题:

ConvertUtilsBean convertUtilsBean = new ConvertUtilsBean();
convertUtilsBean.deregister(DateTime.class);
convertUtilsBean.register(new JodaDateTimeConverter(), DateTime.class);
BeanUtilsBean beanUtilsBean = new BeanUtilsBean(convertUtilsBean, new PropertyUtilsBean());

try {
    beanUtilsBean.setProperty(machineInfo, qName, temp);
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (InvocationTargetException e) {
    e.printStackTrace();
}
并通过创建以下转换器:

class JodaDateTimeConverter implements Converter {

    /* (non-Javadoc)
     * @see org.apache.commons.beanutils.Converter#convert(java.lang.Class, java.lang.Object)
     */
    @SuppressWarnings("unchecked")
    public <T> T convert(Class<T> arg0, Object arg1) {
        DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS");
        DateTime dt = formatter.parseDateTime((String) arg1);
        return (T) dt;
    }
}
类JodDateTimeConverter实现转换器{
/*(非Javadoc)
*@see org.apache.commons.beanutils.Converter#convert(java.lang.Class,java.lang.Object)
*/
@抑制警告(“未选中”)
公共T转换(类arg0,对象arg1){
DateTimeFormatter formatter=DateTimeFormat.forPattern(“yyyy-MM-dd HH:MM:ss.SSS”);
DateTime dt=formatter.parseDateTime((字符串)arg1);
返回(T)dt;
}
}

这适用于
字符串
的情况。但是,它在其他情况下失败。是的,您必须为目标setter强制转换“fieldValue”。也许你可以为每种类型都准备一张地图?