JAXB Objet XML de Triage sans préfixes d'espace de noms
Je travaille sur un projet en java où j'ai besoin de lire quelques-uns des objets à partir d'un fichier XML, faire un peu de traitement qui va modifier les objets, les attributs et puis écrire l'Objet d'un autre fichier XML. Pour cela, je suis en utilisant JAXB avec son rassemblement et de l'unmarshalling capacités, à chacun d'eux dans une méthode, comme ceci:
private MyObject unmarshallXMLFile(String file) {
MyObject t=null;
try {
jc = JAXBContext.newInstance("foo.bar");
Unmarshaller unmarshaller = jc.createUnmarshaller();
SchemaFactory sf = SchemaFactory.newInstance(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI);
unmarshaller.setSchema(sf.newSchema(new File("MySchema.xsd")));
t = (Task) unmarshaller.unmarshal(new File(file));
} catch (JAXBException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
return t;
}
private void marshallXMLFile(String file) {
task.setReplay(Boolean.TRUE);
Marshaller marshaller;
try {
marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, new Boolean(true));
marshaller.marshal(task, new FileOutputStream(file));
} catch (JAXBException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
Le problème est que générés automatiquement préfixes d'espace de noms tels que ns2 ou ns3 garder apparaissant dans le fichier de sortie, et puis quand je veux le réutiliser les fichiers avec l'unmarshallXMLFile méthode (je vais être en utilisant les fichiers de sortie que de l'entrée de nouveau plus tard), il n'validé par rapport au schéma, et jette un org.xml.sax.SAXParseException. Voici les fichiers que j'ai écrit:
Schéma XML: Monschema.xsd
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/MySchema"
xmlns:spm="http://www.example.org/MySchema"
elementFormDefault="qualified"
attributeFormDefault="qualified">
<element name="task" >
<complexType>
<sequence>
<element name="replay" type="boolean" default="false"/>
<element name="threads" type="spm:spThread" maxOccurs="unbounded" minOccurs="1" />
</sequence>
</complexType>
</element>
<complexType name="spThread">
<sequence>
<element name="SPThreadID" type="int" />
<element name="durtime" minOccurs="0" default="0">
<simpleType>
<restriction base="int">
<minInclusive value="0" />
</restriction>
</simpleType>
</element>
<element name="minexecutions" minOccurs="0" default="0">
<simpleType>
<restriction base="int">
<minInclusive value="0" />
</restriction>
</simpleType>
</element>
<element name="numThreads" type="int" />
<element name="procedures" type="spm:procedure" minOccurs="1"
maxOccurs="unbounded" />
</sequence>
</complexType>
<complexType name="procedure">
<sequence>
<element name="id" type="int" minOccurs="1" />
<element name="name" type="string" minOccurs="1" />
<element name="weight" minOccurs="1">
<simpleType>
<restriction base="int">
<minInclusive value="0" />
<maxInclusive value="100" />
</restriction>
</simpleType>
</element>
<element name="parameterPool" type="spm:parameter" nillable="true"
minOccurs="0" maxOccurs="unbounded" />
</sequence>
</complexType>
<complexType name="parameter">
<sequence>
<element name="name" type="string" minOccurs="1" />
<element name="dataType" type="spm:parameterDataType" default="integer"/>
<element name="parmType" type="spm:parameterType" default="in"
minOccurs="0" />
<element name="minValue" type="string"/>
<element name="maxValue" type="string"/>
<element name="value" type="string"/>
</sequence>
</complexType>
<simpleType name="parameterDataType">
<restriction base="string">
<enumeration value="integer" />
<enumeration value="varchar" />
<enumeration value="char" />
</restriction>
</simpleType>
<simpleType name="parameterType">
<restriction base="string">
<enumeration value="in" />
<enumeration value="out" />
<enumeration value="in_out" />
</restriction>
</simpleType>
</schema>
fichier d'entrée:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<task xmlns="http://www.example.org/MySchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/MySchema MySchema.xsd ">
<replay>true</replay>
<threads>
<SPThreadID>0</SPThreadID>
<durtime>10</durtime>
<minexecutions>2</minexecutions>
<numThreads>3</numThreads>
<procedures>
<id>1</id>
<name>run</name>
<weight>15</weight>
<parameterPool>
<name>energy</name>
<dataType>integer</dataType>
<parmType>in</parmType>
<minValue>10</minValue>
<maxValue>50</maxValue>
<value>11</value>
</parameterPool>
<parameterPool>
<name>speed</name>
<dataType>integer</dataType>
<parmType>in</parmType>
<minValue>12</minValue>
<maxValue>80</maxValue>
<value>13</value>
</parameterPool>
</procedures>
</threads>
</task>
fichier de sortie (sans aucun traitement que ce soit: il suffit de unmarshalling et de l'ordonnancement de retour avec les méthodes mentionnées précédemment)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:task xmlns="http://www.example.org/MySchema" xmlns:ns2="http://www.example.org/MySchema.xsd">
<replay>true</replay>
<threads>
<SPThreadID>0</SPThreadID>
<durtime>10</durtime>
<minexecutions>2</minexecutions>
<numThreads>3</numThreads>
<procedures>
<id>1</id>
<name>run</name>
<weight>15</weight>
<parameterPool>
<name>energy</name>
<dataType>integer</dataType>
<parmType>in</parmType>
<minValue>10</minValue>
<maxValue>50</maxValue>
<value>11</value>
</parameterPool>
<parameterPool>
<name>speed</name>
<dataType>integer</dataType>
<parmType>in</parmType>
<minValue>12</minValue>
<maxValue>80</maxValue>
<value>13</value>
</parameterPool>
</procedures>
</threads>
</ns2:task>
exception (lors de l'utilisation de la sortie à nouveau le fichier en entrée):
javax.xml.bind.UnmarshalException
- with linked exception:
[org.xml.sax.SAXParseException: cvc-elt.1: The declaration of the element'ns3:task' could not be found.]
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:326)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshalException(UnmarshallerImpl.java:500)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:206)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:175)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:148)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:153)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:162)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:180)
at Test.main(Test.java:48)
Caused by: org.xml.sax.SAXParseException: cvc-elt.1: The declaration of the element'ns3:task' could not be found.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
at org.apache.xerces.jaxp.validation.XMLSchemaValidatorHandler.startElement(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.ValidatingUnmarshaller.startElement(ValidatingUnmarshaller.java:85)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:113)
at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
at org.apache.xerces.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.scanRootElementHook(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:202)
... 6 more
J'ai été lire sur le sujet et essayé des charges de réponses, mais aucun d'entre eux ne semble supprimer les préfixes. Je suis allé à travers cette guide mais la version de jaxb je suis ne prend pas en charge NamespacePrefixMapper. J'ai essayé d'utiliser les annotations comme décrit ici pour configurer les préfixes, mais qui ne le travail.
Peut-être il ya un moyen de se débarrasser de cette préfixes d'espace de noms: tous les forums, les réponses et les discussions j'ai constaté parler de la personnalisation de ce préfixes, je veux juste pour se débarrasser d'eux. Mais de toute façon ça me fait penser que je manque quelque chose dans mon fichier d'entrée et le schéma. Sont-ils bien écrit? Je dirais que là est le problème, parce que c'est la première fois que je travaille avec des fichiers xml et xsd à cette profondeur, et ce que j'ai fait est uniquement basé sur ce que j'ai trouvé en ligne. Des conseils sur l'amélioration de l'xml et xsd modèles seraient très appréciés
dois-je utiliser une sorte de préfixes dans le fichier d'entrée ou dans le schéma de sorte que le JAXB cadre de l'habitude de générer au hasard des préfixes au moment de la composition des trains?
merci d'avance, j'espère que vous les gars peut m'aider.
--
Merci beaucoup pour la réponse. De cette façon, je peux utiliser le NamespacePrefixMapper. Cependant, lorsque je l'utilise, mon code continue de lever des exceptions quand je le lance:
Exception in thread "main" java.util.MissingResourceException: Can't find bundle for base name javax.xml.bind.Messages, locale de_DE
at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:863)
at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:832)
at java.util.ResourceBundle.getBundle(ResourceBundle.java:576)
at javax.xml.bind.Messages.format(Messages.java:47)
at javax.xml.bind.Messages.format(Messages.java:36)
at javax.xml.bind.PropertyException.<init>(PropertyException.java:99)
at javax.xml.bind.helpers.AbstractMarshallerImpl.setProperty(AbstractMarshallerImpl.java:349)
at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.setProperty(MarshallerImpl.java:527)
at Test.main(Test.java:95)
J'ai trouvé qu'il doit faire quelque chose avec .fichier de propriétés: je ne suis pas en utilisant quelque chose comme ça, je n'ai pas changé quoi que ce soit.
OriginalL'auteur Lak | 2011-07-05
Vous devez vous connecter pour publier un commentaire.
Au lieu de spécifier la
@XmlElement
'attribut d'espace de noms dans chaque élément, il est plus simple de les annoter au niveau du colis.Vous faire que par la création d'un fichier
package-info.java
juste en dessous du paquet que vous souhaitez annoter.Par exemple, si vous souhaitez annoter le paquet
org.example
, un fichier nommépackage-info.java
doit être placé dans le répertoire org/exemple avec le contenu suivant:Il est important de noter que vous devez annoter chaque package contient les classes qui sont vos plans pour le maréchal ou référencés par ceux-ci.
Espère que cela aide 🙂
OriginalL'auteur cristian.ebbens
Essayez d'utiliser un
NamespacePrefixMapper
:OriginalL'auteur kwo
Bien, après quelques recherches, j'ai essayé d'utiliser le
@XMLElement
tag sur chaque attribut des classes, je suis en train de sérialiser, en précisant clairement ce que mon espace de noms, et en utilisant la même sur chaque attribut:Cela a fonctionné parfaitement: pas plus bizarre espaces de noms dans le muselé fichier.
Je veux le remercier pour sa réponse: j'ai essayé ça aussi, mais j'ai une langue étrange faisceau d'exception liés. Im heureux de cette approche plus simple a résolu le problème.
OriginalL'auteur Lak
Alors vous pourriez être en utilisant un autre JAXB mise en œuvre puis la référence. Lisez cet article et essayez de nouveau: http://blog.bdoughan.com/2011/11/jaxb-and-namespace-prefixes.html (ou si vous êtes paresseux: remplacer com.soleil.xml.bind.namespacePrefixMapper avec com.soleil.xml.interne.bind.namespacePrefixMapper)
OriginalL'auteur Stefan
Java 7/8 solution
Ce problème est lié à l'implémentation par défaut JAXB Fournisseur. J'ai trouvé une solution à l'aide d'une mise en œuvre différente: EclipseLink MOXy.
1. ajouter la dépendance dans
pom.xml
2. créer un fichier jaxb.propriétés contenant la ligne suivante
déplacer le fichier dans le package de modèle
3. créer package-file.java dans le modèle de colis
OriginalL'auteur freedev