Comment ignorer boîtier de noms d'élément dans JaxB
Comme indiqué dans le titre je veux ignorer boîtier de noms d'éléments dans un document.
static class XY433 {
@XmlAttribute(name = "C200")
String c200;
@XmlAttribute(name = "C215")
String c215;
@XmlAttribute(name="F001")
String f001;
@XmlAttribute(name="f001")
String lcf001; //I want to avoid this duplication
}
J'ai essayé d'utiliser le code posté par Blaise Doughan:
private static class ToLowerCaseNamesStreamReaderDelegate extends StreamReaderDelegate {
public ToLowerCaseNamesStreamReaderDelegate(XMLStreamReader xsr) {
super(xsr);
}
@Override
public String getAttributeLocalName(int index) {
return super.getAttributeLocalName(index).toLowerCase();
}
@Override
public String getLocalName() {
return super.getLocalName().toLowerCase();
}
}
@XmlRootElement(name="doc")
static class Doc {
@XmlElement(name="element")
List<Element> elements;
}
static class Element {
@XmlAttribute(name = "abc")
String abc;
}
public static void main(String[] args) throws Exception {
XMLInputFactory xif = XMLInputFactory.newInstance();
XMLStreamReader xsr = xif.createXMLStreamReader(new FileInputStream("LowerCaseElementNamesFilterTest.xml"));
Unmarshaller u = JAXBContext.newInstance(Doc.class).createUnmarshaller();
//Do unmarshalling
Doc doc = (Doc) u.unmarshal(new ToLowerCaseNamesStreamReaderDelegate(xsr));
System.out.println(doc.elements.get(0).abc);
System.out.println(doc.elements.get(1).abc);
System.out.println(doc.elements.get(2).abc);
}
Cette réalité n'a pas de travail.
null
2
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
at java.util.ArrayList.RangeCheck(ArrayList.java:546)
at java.util.ArrayList.get(ArrayList.java:321)
at com.hre.commons.tec.xml.LowerCaseElementNamesFilter.main(LowerCaseElementNamesFilter.java:58)
Pour ce XML:
<doc>
<Element ABC="1"></Element>
<element Abc="1"></element>
<element abc="2"></element>
</doc>
regardez download.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/... et ce queistion est très similaire à stackoverflow.com/questions/659872/... 🙂
Comment est ma question relative à ce super classe en question? Comment puis-je utiliser le AccessType? Ma question est sur le f001 et lcf001. Je veux juste un champ lié à "F001" et "f001".
Pouvez-vous préciser pourquoi vous voulez remplacer la casse de la nature de XML? Est-ce parce que vous n'êtes pas dans le contrôle des données entrantes?
Oui, il est produit à partir d'une application existante.
Et même le wsdl permet par définition de chaque élément dans tous les cas. 🙁
Comment est ma question relative à ce super classe en question? Comment puis-je utiliser le AccessType? Ma question est sur le f001 et lcf001. Je veux juste un champ lié à "F001" et "f001".
Pouvez-vous préciser pourquoi vous voulez remplacer la casse de la nature de XML? Est-ce parce que vous n'êtes pas dans le contrôle des données entrantes?
Oui, il est produit à partir d'une application existante.
Et même le wsdl permet par définition de chaque élément dans tous les cas. 🙁
OriginalL'auteur tkr | 2010-12-07
Vous devez vous connecter pour publier un commentaire.
Vous pouvez mapper tous vos propriétés à la baisse des cas de noms de nœud, puis les envelopper d'une XMLStreamReader appeler toLowerCase() sur tous les attributs/des noms d'éléments, il est revenu. Puis unmarshal à partir de ce XMLStreamReader.
J'ai récemment ajouté un d'accroître la demande pour EclipseLink JAXB (MOXy) pour cette question, n'hésitez pas à fournir des informations supplémentaires:
Modèle D'Objet
Le Code De Démonstration
Va lire ces documents XML:
Et écrire le code XML suivant:
Ci-dessous un lien pour un exemple plus détaillé:
Mise à JOUR
Votre code fonctionne dans mon environnement (JDK 1.6.0_20 avec les deux inclus JAXB, et EclipseLink JAXB (MOXy) 2.2, je suis également en utilisant la valeur par défaut de mise en œuvre de StAX). Quand je lance votre exemple:
J'obtiens le résultat suivant:
Mise à JOUR #2
À l'adresse:
Avez-vous essayé de modifier le délégué?:
Découvrez: download.oracle.com/javase/6/docs/api/javax/xml/stream/util/...
+1 pour un peu simple de filtrage d'entrée
En fait le code ne fonctionne pas.
En cours d'exécution avec <client Id="1">... résultat au client.id==0
OriginalL'auteur bdoughan
Rencontre le même problème.
Ma solution est d'ajouter
@XmlAdpater
sur le modèle de l'entité, qui fait référence à votre propreXMLAdapter
, cela donnerait un flexible de personnalisation sur le marshall/unmarshall.OriginalL'auteur Ralph
Je suis à l'aide de moxy version 2.7.1 et il fonctionne très bien avec UnmarshallerProperty comme ci-dessous.
eclipselink documentation
OriginalL'auteur Mustafa Basaran