2015-02-03 3 views
2

У меня есть XML:SimpleXml десериализации Карта <String, String>

<?xml version="1.0" encoding="UTF-8"?> 
<addresses xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:noNamespaceSchemaLocation='schema_task1_1.xsd'> 

    <address> 
    <name>Bill</name> 
    <city>NewYork</city> 
    <street>First</street> 
    <phone type='mobile'>+19139130000</phone> 
    <documents> 
     <document type='driving_permit'>9045798749</document> 
     <document type='passport'>3451231231</document> 
    </documents> 
    </address> 

    <address> 
    ... 
    </address> 

</addresses> 

и классы Java:

@Root(name = "addresses") 
public class Addresses { 

    @ElementList(inline = true, entry = "address", required = false, type = Address.class) 
    private List<Address> addresses = new ArrayList<Address>(); 

public class Address { 

    @Element(required = false) 
    private String name; 
    @Element(required = false) 
    private String city; 
    @Element(required = false) 
    private String street; 
    @ElementMap(entry = "phone", key = "type", attribute = true, inline = true) 
    private Map<String, String> phones; 
    @ElementMap(entry = "documents", key = "type", attribute = true, inline = true) 
    private Map<String, String> documents = new HashMap<String, String>(); 

Все поля десериализации успешно, за исключением documents. Это всегда null при попытке десериализации. Я тонкий, у меня есть ошибка в аннотации @ElementMap, но я не знаю, что именно. Что я делаю не так?

PS. Я не могу изменить структуру объекта, потому что он используется другими синтаксическими анализаторами.

ответ

0

я решил мою проблему, но не слишком хорошо. Если вы знаете лучшее решение, пожалуйста, дайте мне знать. Я просто фиксировал аннотацию для documentMap и добавил uselessVariable с аннотацией. Он работает и не разбивает старый код.

UPD. Я нашел лучшее решение. Добавлено @Path аннотация.

@Root(name = "addresses") 
public class Addresses { 

    @ElementList(inline = true, entry = "address", required = false, type = Address.class) 
    private List<Address> addresses = new ArrayList<Address>(); 

public class Address { 

    @Element(required = false) 
    private String name; 
    @Element(required = false) 
    private String city; 
    @Element(required = false) 
    private String street; 
    @ElementMap(entry = "phone", key = "type", attribute = true, inline = true) 
    private Map<String, String> phones; 
    @Path("./documents") 
    @ElementMap(entry = "document", key = "type", attribute = true, inline = true) //changed this line 
    private Map<String, String> documents = new HashMap<String, String>(); 
1

Вы должны создать промежуточный класс для обработки «документов». Этот класс будет содержать вас карту из «документа»:

class Address { 
... 
    @Element(required = false) 
    private Documents documents; 
} 
class Documents { 
    @ElementMap(entry = "document", key = "type", attribute = true, inline = true) 
    private Map<String, String> documents = new HashMap<String, String>(); 
}