JAXB Unmarshalling: Liste des objets
J'ai
@XmlRootElement(namespace = "http://www.w3.org/2005/Atom", name = "content")
@XmlType(name = "course")
public class Course implements Resource
...
@XmlElementWrapper(name="subcourses")
@XmlElement(name="course")
List<Xlink> subcourses; //!?
et Xlink classe, qui fonctionne très bien dans inline variable.
public class Xlink
{
private String href;
private String value;
@XmlAttribute(namespace = "http://www.w3.org/1999/xlink")
public String getHref()
{
return href;
}
public void setHref(String href)
{
this.href = href;
}
@XmlValue
public String getValue()
{
return value;
}
public void setValue(String value)
{
this.value = value;
}
}
pour une entrée XML de
<atom:content atom:type="xml" xsi:type="course">
...
<subcourses>
<course xlink:href="course1">Some course</course>
<course xlink:href="course2">other course</course>
Et subcourses refuse d'être unmarshalled (sans aucune exception levée).
Remarque: MOXy est malheureusement pas une option.
Edit: nouveau mobilisé l'objet
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns3:content xmlns:ns2="http://www.w3.org/1999/xlink" xmlns:ns3="http://www.w3.org/2005/Atom">
<code>SOME CODE</code>
<name>name</name>
<subcourses>
<course ns2:href="Some href">some value</course>
<course ns2:href="sdsdg">sdfhdfhdhdh</course>
</subcourses>
</ns3:content>
Edit2: après une période d'expérimentation avec unmarshalling et de l'ordonnancement d'un objet de test, j'ai découvert que j'ai besoin de définir xmlns espace de noms dans l'en-tête du contenu pour le match xlink:href=
comme xmlns:xlink="http://www.w3.org/1999/xlink"
le problème est que je suis le Cours de l'élément à l'intérieur d'une classe wrapper qui est analysé par resteasy. Ainsi, la classe résultante ne porte pas sur les informations d'espace de noms.
J'ai en quelque sorte besoin de forcer JAXB pour comprendre que xmlns:xlink="http://www.w3.org/1999/xlink"
s'applique aux éléments de cours, mais après une heure de google, je suis à une perte.
Edit3: je suis l'obtention de mon objet de
https://github.com/jirutka/atom-jaxb/blob/master/src/main/java/cz/jirutka/atom/jaxb/Entry.java
qui est utilisé sur le serveur de contrepartie. Ce qui est une partie de
https://github.com/jirutka/atom-jaxb/blob/master/src/main/java/cz/jirutka/atom/jaxb/Feed.java
Parties pertinentes de mon unmarshalling code sont:
Feed f = r.readEntity(Feed.class);
out.addAll(unmarshaller.Unmarshal(f.getEntries(), clazz));
où r
est un javax.ws.rs.core.Response
. Et le unmarshaller
public List<T> Unmarshal(List<Entry> entries, Class clazz)
{
List<T> out = new ArrayList<T>();
T instance;
for (Entry e : entries)
{
try
{
JAXBContext context = JAXBContext.newInstance(clazz);
Unmarshaller unmarsh = context.createUnmarshaller();
instance = (T) unmarsh.unmarshal((Node) e.getContent());
Puisque c'est ma première enchevêtrement avec cette technologie, il est tout à fait possible que ce code est 'wtf'.
- Qu'entendez-vous par "refuse d'être unmarshalled'? Seulement fournit une liste vide?
- Oui, à chaque fois, 0 articles.
- Pouvez-vous fournir plus de détails sur l'endroit où le fragment XML vous unmarshalling vient d'où?
Vous devez vous connecter pour publier un commentaire.
Lorsque vous annotez le champ (variable d'instance) assurez-vous de mettre
@XmlAccessorType(XmlAccessType.FIELD)
sur votre classe.Alors assurez-vous que votre XML d'entrée est correctement espace de noms qualifiés. Votre document d'entrée devrait ressembler à quelque chose comme ce qui suit:
Avec ma mise à jour
Course
classe, votreXlink
classe et un espace de noms qualifiés document XML suivant le code de démonstration a fonctionné parfaitement pour moi.Mise à JOUR #1
Le meilleur endroit pour fixer votre question est de savoir où vous avez extrait le fragment que vous souhaitez unmarhal. Ci-dessous est une stratégie que vous pouvez utiliser avec StAX.
input.xml
Ci-dessous est un exemple de document XML où les informations d'espace de noms est définie ci-dessus, le fragment que vous souhaitez unmarshal.
Démo
Ci-dessous, nous allons utiliser un StAX
XMLStreamReader
pour naviguer vers le fragment cible. Nous allons avoir notre JAXB mise en œuvre unmarshal ce fragment. De cette façon, toutes les informations d'espace de noms est préservée.Sortie
Mise à JOUR #2
Si vous ne pouvez pas produire une meilleure fragment XML comme décrit dans la mise à JOUR no 1, ci-dessous comment vous pouvez réparer le fragment XML que vous avez actuellement.
NamespaceFilter
Vous pouvez utiliser un SAX
XMLFilter
afin de corriger votre document XML.Démo
Ci-dessous comment vous pouvez tirer parti de la
XmlFilter
avec JAXB:Pour Plus D'Informations
Mise à JOUR #3
Ci-dessous est une version simplifiée de votre code d'exemple où tout fonctionne. Peut-être il ya quelque chose de différent dans votre code, il va vous aider à trouver.
Entrée
input.xml
Démo
Sortie
Node
objet.