12
votes

Jaxb Partial-Moamshalling éléments sans @xmlrootelement

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> xxx pré>

} p>

splitter.java em> p> xxx pré>

} 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>


2 commentaires

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


5 Réponses :


3
votes

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): xxx

voir ( avec des tests) pour plus.

et Cet article Pour encore plus sur le sujet.


0 commentaires

1
votes

Vous pouvez exploiter un saxsource pour obtenir le comportement que vous recherchez: xxx

exemple complet: xxx


0 commentaires

4
votes

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;
        }
    }


0 commentaires

0
votes

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


0 commentaires

0
votes

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();
}


0 commentaires