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.

InformationsquelleAutor Lak | 2011-07-05
Schreibe einen Kommentar