JAXB XML-Objekt-Marshalling ohne namespace-Präfixe
Im arbeiten auf ein java-Projekt, wo ich Lesen müssen einige Objekte aus einer XML-Datei, einige der Datenverarbeitung, die in der ändern, die Objekte, Attribute und Schreibe Sie dann das Objekt in eine andere XML-Datei. Für diesen Zweck bin ich mit JAXB mit seinen marshalling und unmarshalling Fähigkeiten, jeder von Ihnen in eine Methode, wie diese:
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();
}
}
Das problem ist, dass die automatisch erzeugten namespace-Präfixe wie ns2 oder ns3 halten, erscheinen in der Ausgabe-Datei, und wenn ich dann wiederverwenden möchten, das Dateien mit der unmarshallXMLFile Methode (die ich verwenden werde, die Ausgabe-Dateien als input wieder später) wird es nicht bekommen validiert gegen das schema, und wirft einen org.xml.sax.SAXParseException. Hier sind die Dateien, die ich schrieb:
XML-Schema: MySchema.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>
input-Datei:
<?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>
Ausgabe-Datei (ohne Verarbeitung auch immer: nur unmarshalling und marshalling zurück mit den oben genannten Methoden)
<?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>
Ausnahme (bei der Verwendung der output-Datei wieder als input):
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
Ive wurde Lesung über das Thema und versucht, die Lasten von zugehörigen Antworten, aber keiner von Ihnen scheint zu entfernen, die Präfixe. Ich ging durch diese guide aber die version von jaxb ich bin mit nicht unterstützt NamespacePrefixMapper. Ich habe versucht, mit Anmerkungen wie beschrieben hier konfigurieren Sie die Präfixe aber das würde nicht funktionieren.
Vielleicht gibt es einen Weg, um loszuwerden, diese namespace-Präfixe: alle Foren, Antworten und Diskussionen ive gefunden, sprechen Sie über das customizing dieser Präfixe, ich will einfach nur, um loszuwerden von Ihnen. Aber irgendwie macht es mich denken, dass ich etwas fehlt in meinen beiden input-Datei und das schema. Sind Sie gut geschrieben? Ich würde sagen, dass genau dort ist das problem, denn es ist das erste mal, dass ich die Arbeit mit xml-und xsd-in dieser Tiefe hat, und dem, was ive getan, ist nur basierend auf was ich online gefunden. Irgendwelche Tipps zur Verbesserung der xml-und xsd-designs wäre sehr dankbar,
soll ich mich mit irgendeiner Art von Präfixen in der input-Datei oder in das schema, damit das JAXB-framework wird nicht generiert zufällige Präfixe bei der marshalling?
vielen Dank im Voraus, ich hoffe, Euch kann mir helfen.
--
Vielen Dank für die Antwort. Auf diese Weise kann ich mit dem NamespacePrefixMapper. Allerdings, wenn ich es benutze, ist mein code hält werfen Ausnahmen, wenn ich es:
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)
Fand ich, dass es hat etwas zu tun mit ein .Datei Eigenschaften: ich bin nicht mit so etwas, ich habe nicht verändert nichts.
- ähnliches Thema / mögliche Duplikate von: stackoverflow.com/questions/1982977/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Anstatt der Angabe der
@XmlElement
's namespace-Attribut in jedem element, es ist einfacher zu kommentieren auf Paket-Ebene.Sie tun das, indem Sie eine Datei
package-info.java
gerade unter dem Paket, das Sie wollen, zu kommentieren.Zum Beispiel, wenn Sie möchten, beschriften Sie das Paket
org.example
, dann eine Datei namenspackage-info.java
gelegt werden muss, in das Verzeichnis org/Beispiel mit folgendem Inhalt:Es ist wichtig zu beachten, dass müssen Sie kommentieren jedes Paket enthält Klassen, die Ihren plan zum Marschall oder verwiesen wird, die von jenen.
Hoffe, das hilft 🙂
Versuchen Sie es mit einem
NamespacePrefixMapper
:Gut, nach einigen Forschung, ich habe versucht mit der
@XMLElement
tag auf alle attribute der Klassen, die ich bin versucht zu serialisieren, die Angabe deutlich, was my-namespace wurde, und das gleiche auf jedes Attribut:Es funktionierte einwandfrei: nicht mehr komisch namespaces in den marshalled-Datei.
Möchte ich danken für seine Antwort: ich habe versucht das so gut, aber ich habe eine seltsame Sprache zusammengehörige Ausnahme. Ich bin froh, diesen einfacheren Ansatz das Problem gelöst.
Dann verwenden Sie möglicherweise eine verschiedene JAXB-Implementierung dann die Referenz. Lesen Sie diesen Artikel und probieren Sie es erneut: http://blog.bdoughan.com/2011/11/jaxb-and-namespace-prefixes.html (oder wenn Sie faul sind: ersetzen Sie com.Sonne.xml.binden.namespacePrefixMapper mit com.Sonne.xml.intern.binden.namespacePrefixMapper)
Java 7/8 Lösung
Dieses problem bezieht sich auf die default-Implementierung JAXB-Provider. Ich habe eine Lösung gefunden, mit einer anderen Implementierung: EclipseLink MOXy.
1. fügen Sie die Abhängigkeit in
pom.xml
2. erstellen Sie eine Datei jaxb.Eigenschaften mit der folgenden Zeile
verschieben Sie die Datei in das package-Modell
3. erstellen package-file.java in der Modell-Paket