2016-12-27 4 views
0

Я работаю с устройством UPnP, которое предоставляет услуги, к которым я хочу получить доступ. Я использую SimpleXML для сортировки данных. Пока все хорошо, за исключением того, что теперь я снова застреваю.Почему SimpleXML не десериализует атрибут?

Учитывая в XML ниже:

<DIDL-Lite xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:dc="http://purl.org/dc/elements/1.1/"> 
    <item id="123456" parentID="1" restricted="1"> 
     <res protocolInfo="http-get:*:video/mpeg:*">http://stream_resource/media/index.m3u8</res> 
     <upnp:callSign>My Call Sign here</upnp:callSign> 
     <upnp:class>object.item.videoItem.videoBroadcast</upnp:class> 
     <dc:title>My Title Here</dc:title> 
    </item> 
</DIDL-Lite> 

У меня есть следующие POJOs:

Корень:

@Root(name = "DIDL-Lite") 
@NamespaceList({ 
     @Namespace(reference = "urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"), 
     @Namespace(reference = "urn:schemas-upnp-org:metadata-1-0/upnp/", prefix = "upnp"), 
     @Namespace(reference = "http://purl.org/dc/elements/1.1/", prefix = "dc") 
}) 
public class ResultObject { 

    @ElementList(name = "item") 
    private List<ObjectItem> listItems; 
} 

ObjectItem:

@Root(name = "item") 
public class ObjectItem { 

    @Attribute(name = "id") 
    private String id; 

    @Attribute(name = "parentID") 
    private String parentID; 

    @Attribute(name = "restricted") 
    private String restricted; 

    @Element(name = "res")//something appears to be wrong here ! this element is not actually parsed ? 
    private ResourceInfo resInfo; 

    @Element(name = "callSign") 
    private String callSign; 

    @Element(name = "class") 
    private String upnpClass; 

    @Element(name = "title") 
    private String dcTitle; 
} 

ResourceInfo:

@Root(name = "res") 
public class ResourceInfo { 

    @Attribute(name = "protocolInfo") 
    private String protocolInfo; 
} 

Это ошибка синтаксического анализа, что я получаю: W/System.err: org.simpleframework.xml.core.AttributeException: Атрибут 'protocolInfo' не имеет аналогов в классе xx.yyy.ObjectItem в строке 1.

После некоторого копания, я пытался десериализация этого значения в ElementMap так:

ObjectItem:

@Root(name = "item") 
public class ObjectItem { 

    @Attribute(name = "id") 
    private String id; 

    @Attribute(name = "parentID") 
    private String parentID; 

    @Attribute(name = "restricted") 
    private String restricted; 

    @ElementMap(entry = "res", key = "protocolInfo", attribute = true, inline = true) 
    //so what is actually going on here? 
    private Map<String, String> elementMap; 

    @Element(name = "callSign") 
    private String callSign; 

    @Element(name = "class") 
    private String upnpClass; 

    @Element(name = "title") 
    private String dcTitle; 

Все еще получаю ошибка синтаксического анализа.

Любые подсказки?

+0

Почему вы не используете цепляться за UPnP? http://4thline.org/projects/cling/ –

+0

@PogonetsAnton Я попытался интегрировать цепляние, но отказался от двух причин: в основном у меня не было опыта работы с UPNP, и цепляние казалось тяжелым для меня как стартера. Во-вторых, устройство UPNP, с которым я работаю, использует некоторые пользовательские механизмы обнаружения и аутентификации, и мне не удалось установить соединение с устройством, используя cling. С этим в стороне, Клинг - потрясающая библиотека. – nightfixed

ответ

1

Проблема не в ObjectItem, так как объекты ObjectItems хранятся в ResultObject.

Использование @ElementList(name = "item", inline = true) на List<ObjectItem> listItems; вместо @ElementList(name = "item")

или просто @ElementList(inline = true) имени не требуется в данном случае.

Смотрите различия:

@ElementList

@ElementList(inline = true)

+0

Я внес изменения, как вы предложили, и решила мою проблему. Кроме того, я также «ввел» все мои '@ ElementList'. Спасибо ! – nightfixed

Смежные вопросы