J'utilise l'exemple partial-unmarshalling strong> de Jaxb fort>, mais je suis incapable de lamairez-les xml-éléments qui ne sont pas sur le niveau de la racine (car ils ne font pas ' t avoir une balise @xmlrootelement). Dans mon exemple, j'ai essayé de lire le shipto-élément au lieu de l'élément de commande. Normalement, je travaillerais avec Jaxbelement Unmarshal (Source Source, Class RealedType), mais étant donné que l'exemple utilise un MoMaShallerHandler et un XMLFilterImpl Je ne sais pas où dire à Jaxb quelle classe elle devrait utiliser. P> Mon message d'erreur est: causé par: javax.xml.bind.unmarshalexception: élément inattendu (URI: "", local: "Shipto"). Les éléments attendus sont , , P> J'ai beaucoup sur beaucoup, mais je n'ai rien trouvé d'utile encore. P> ici est l'exemple code de la page Web JAXB: p> Main.java em> p> } p> splitter.java em> p> } p> primer.xsd em> p> <purchaseOrders>
<!-- 1st -->
<purchaseOrder orderDate="1999-10-20">
<shipTo country="US">
<name>Alice Smith</name>
<street>123 Maple Street</street>
<city>Cambridge</city>
<state>MA</state>
<zip>12345</zip>
</shipTo>
<billTo country="US">
<name>Robert Smith</name>
<street>8 Oak Avenue</street>
<city>Cambridge</city>
<state>MA</state>
<zip>12345</zip>
</billTo>
<items/>
</purchaseOrder>
</purchaseOrders>
5 Réponses :
Votre échantillon est surchargé (> 300 lignes). S'il vous plaît, pouvez-vous essayer de le faire correspond à 30 lignes de code?
Dans la pratique, JAXB peut smarshal un flux avec 2 lignes de code (en supposant que vos classes soient correctement annotées): p> voir
Vous pouvez exploiter un exemple complet: p> saxsource code> pour obtenir le comportement que vous recherchez:
J'ai eu ce problème précis; Essayer d'utiliser l'exemple partiel-immalaire à partir de la mise en oeuvre de référence JAXB.
La solution que j'ai installée est d'ajouter une personnalisation com.sun.xml.bind.api.classresolver dans le MODARSALLER créé dans la méthode de démarrage, ci-dessus . Voir: P>
new ClassResolver() { @Override public Class<?> resolveElementName(String nsUri, String localName) throws Exception { if(MY_NAMESPACE.equals(nsUri) && MY_BAR.equals(localName)) return BarType.class; else return null; } }
Habituellement, cette erreur est lancée lorsque vous essayez de transmettre la classe d'élément d'enfant comme argument à l'instance JAXB. Essayez de passer la classe racine comme argument et vérifiez si cela fonctionnera ou non p>
C'est la fonction que j'utilise pour de tels cas.
/** * Loads an xml with a non <code>XmlRootElement</code> annotated element * * @param <T> Class to be unserialized * @param xmlStream {@link InputStream} The input stream of the xml file * @param modelClass <code>.class</code> of the model to read. This class may or not have the <code>XmlRootElement</code> annotation * @return {@link AppModel} Instance of the model * @throws JAXBException Error while reading the xml from the input stream */ public static <T> T readNonRootDataModelFromXml(InputStream xmlStream, Class<T> modelClass) throws JAXBException { JAXBContext jaxbContext = JAXBContext.newInstance(modelClass); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); JAXBElement<T> xmlRootElement = unmarshaller.unmarshal(new StreamSource(xmlStream), modelClass); return (T) xmlRootElement.getValue(); }
Quand je gère votre exemple, je reçois "Cet ordre sera expédié à Alice Smith".
Oui correct! Le code fonctionne, mais si vous changez de cette façon de lire "Shipto" au lieu de "PachetOrder", l'erreur monte