Я работаю с устройством 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;
Все еще получаю ошибка синтаксического анализа.
Любые подсказки?
Почему вы не используете цепляться за UPnP? http://4thline.org/projects/cling/ –
@PogonetsAnton Я попытался интегрировать цепляние, но отказался от двух причин: в основном у меня не было опыта работы с UPNP, и цепляние казалось тяжелым для меня как стартера. Во-вторых, устройство UPNP, с которым я работаю, использует некоторые пользовательские механизмы обнаружения и аутентификации, и мне не удалось установить соединение с устройством, используя cling. С этим в стороне, Клинг - потрясающая библиотека. – nightfixed