2016-11-24 3 views
2

Имейте документ XML, который я хочу преобразовать в Java-компонент. Я хочу пометить недостающие поля в моем bean-компоненте на hashMap, потому что это имя поля меняется. Есть ли способ сделать это?Как сделать XStream немаркированных тегов для HashMap при анализе XML?

Например, мой XML выглядит

<employee> 
    <firstname>stack</firstname> 
    <lastname>alpha</lastname> 
    <phone1>999-999-9999</phone1> 
</employee> 

Мой Java Bean выглядеть

@XstreamAlias("employee") 
public class Employee { 
     private String firstname; 
     private String lastname; 
     private map<String, String> unknownfields; 
} 

Когда я загружаю XML в моей Java Bean, он должен выглядеть

firstname="stack", lastname="alpha", unknownfields=[{"phone1","999-999-9999"}] 

Знайте, что это плохой дизайн, но он хотел проверить, можно ли это реализовать с помощью xstream.

ответ

0

Внесите свой собственный конвертер. Взгляните на JavaBeanConverter для ссылочной реализации, потому что вы хотите быть как можно ближе к этому.

Единственное место, где вам нужно будет обрабатывать все по-другому это (в пределах распаковать метод )

if (propertyExistsInClass) { 
    Class<?> type = determineType(reader, result, propertyName); 
    Object value = context.convertAnother(result, type); 
    beanProvider.writeProperty(result, propertyName, value); 
    seenProperties.add(new FastField(resultType, propertyName)); 
} else { 
    throw new MissingFieldException(resultType.getName(), propertyName); 
} 

Где, из еще блока, он бросает MissingFieldException, вы должны заполнить ваш Map. Имя элемента XML легко доступно здесь, но вам нужно настроить значение. Ключ, чтобы получить значение находится в , если блок чуть выше:

Object value = context.convertAnother(result, type); 

Единственная проблема в том, что вы не имеете тип Java, чтобы преобразовать значение в. Может быть, строка?

Я бы наследовал JavaBeanConverter и просто переоценил метод unmarshal, но в соответствии с вашими потребностями.

+0

Спасибо Soumik. Понял ваш намек. Попробует. – Pals