7
votes

Attribut de mappage XML d'élément imbriqué

J'utilise Xtream et j'ai un échantillon XML: xxx

et je veux mapper sur la classe xxx

L'idée est donc de cartographier l'attribut d'élément imbriqué à l'objet actuel. J'ai essayé de trouver tout convertisseur prêt à l'emploi sans succès. Je crois que cela est possible en mettant en œuvre un nouveau convertisseur mais peut être quelqu'un déjà fait cela. Ou il y a une solution que je n'ai pas trouvée.

Mis à jour:

L'idée que j'essaie de mettre en œuvre est d'omettre des entités inutiles d'être créées et mappées. Je n'ai pas besoin d'entités téléphoniques et fax, je n'ai besoin que de leurs attributs dans mon modèle. Le schéma XML que j'essaie d'analyser est tiersparté pour moi et je ne peux pas le changer.


3 commentaires

Bien taché! J'ai réparé ça. Était juste écrit à partir de zéro.


Pourriez-vous clarifier ce que vous recherchez un peu plus? Vous dites "je n'ai pas besoin d'entités de téléphone et de fax ...", vous ne les avez pas - ce ne sont pas des chaînes dans votre modèle, pas des entités séparées ... Voulez-vous que seuls les deux premiers attributs mappés ou tout les quatres?


Le problème consiste à mapper l'échantillon XML sur le modèle. Sans aucun effort supplémentaire, XStream supposé des éléments XML à interpréter comme des membres modèles de toute façon (même ils sont explicitement omis). Avoir un schéma XML riche que vous aimeriez probablement simplifier le modèle pour échapper aux «détenteurs» redondants de données significatives. Les collections implicites sont bonnes mais pas assez.


3 Réponses :


0
votes

voir la section "Attribut aliasing" du tutoriel d'alias Xtream: http: // x- stream.github.io/alias-Tutorial.html .


1 commentaires

Merci Olaf. J'ai mis à jour la question. Pourrait-il être accompli avec le scénario du tutoriel, je me demande?



5
votes

Je ne connais pas d'un convertisseur prêt à l'emploi qui le fera, mais il est assez trivial d'écrire un xxx pré>

Vous pouvez fixer le convertisseur aux champs correspondants à l'aide d'Annotations P>

XStream xs = new XStream();
xs.processAnnotations(Person.class);
Person p = (Person)xs.fromXML(
  "<person>\n" +
  "  <firstname>Joe</firstname>\n" +
  "  <lastname>Walnes</lastname>\n" +
  "  <phone value='1234-456' />\n" +
  "  <fax value='9999-999' />\n" +
  "</person>");
System.out.println(p);
// prints fn: Joe, ln: Walnes, p: 1234-456, f: 9999-999


2 commentaires

Merci, je vais vérifier. Pas sûr de comprendre comment ça marche là-bas. Peut-être que le manque de convertisseurs de compréhension du tout.


Lorsque Xstream lit XML qui représente une classe de type de haricot, il lit le nom de l'élément pour déterminer quel champ il traitait, puis délégués au convertisseur correspondant. La méthode MODARSHAL Le convertisseur est transmis un hierarchicalstreamreader qui pointe sur la balise d'ouverture de la (dans ce cas) téléphone . Les convertisseurs de valeur unique normaux fonctionnent sur le contenu du texte de l'élément, mais mon convertisseur personnalisé examine à la place l'attribut nommé valeur - il n'a pas besoin de prendre soin de ce que le nom de l'élément était.



4
votes

Note: strong> Je suis le Eclipselink Jaxb (Moxy ) strong> plomb et membre du JAXB (JSR -222) strong> groupe d'experts.

Si vous êtes ouvert à l'utilisation d'une bibliothèque autre que Xtream, ci-dessous est la manière dont vous pouvez tirer parti de l'extension @xmlpath code> dans Eclipselink Jaxb (Moxy) Strong>. P>

personne forte> p>

Le @xmlpath code> Annotation vous permet de mapper votre champ / Propriété dans un emplacement dans le document XML par un XPath (voir: http: / /blog.bdoughan.com/2010/07/XPATH-BASED-Mapping.html ). P>

<?xml version="1.0" encoding="UTF-8"?>
<person>
   <firstname>Joe</firstname>
   <lastname>Walnes</lastname>
   <phone value="1234-456"/>
   <fax value="9999-999"/>
</person>


2 commentaires

Merci beaucoup pour une réponse aussi détaillée. J'ai trouvé Jaxb sur l'enquête sur cette question et @xmlpath était la première chose à laquelle j'étais concernant. Pourriez-vous s'il vous plaît donner une brève explication sur maintenant cela fonctionne, je veux dire, cela nécessite-t-il des éléments supplémentaires à sortir? Les performances et l'efficacité des données sont des exigences les plus fortes pour moi pour l'instant.


@Viktorstolbin - @xmLPath est en fait une extension fournie dans la mise en œuvre de Eclipselink Moxy de la spécification JAXB (JSR-222). Moxy prend en charge un sous-ensemble de XPath pouvant être procédé lors de la première étape de la profondeur de la carte unique d'un document XML. C'est un processus très efficace.