5 Stimmen

Unmarshalling von Xml mit JAXB - Namespace mit XmlType und Proporder

Ich versuche, eine Xml-Datei mit JAXB zu unmarshalen. Wenn ich @XmlElement mit dem richtigen Namen und Namespace verwende, funktioniert das Unmarshalling (z. B. @XmlElement(name = "name", namespace="http://www.test.com")).

Wenn ich XmlType zusammen mit propOrder verwende, funktioniert das leider nicht mehr (z.B. @XmlType(namespace="http://www.test.com", name = "", propOrder = {"name", "description"})).

Der Inhalt der Xml-Datei (test.xml):

<Operation xmlns="http://www.test.com">
  <Parameter>
    <name>Param1</name>
    <description>Description of Parameter1</description>
  </Parameter>
  <Parameter>
    <name>Param2</name>
    <description>Description of Parameter2</description>
  </Parameter>
</Operation>

Der Inhalt von JAXBExample.java ist:

package stackoverflow.problem.jaxb.ns;

import java.io.FileNotFoundException;
import java.io.FileReader;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

public class JAXBExample {

  public static void main(String[] args) throws JAXBException, FileNotFoundException   {
  String xmlFilename = "test.xml";

    JAXBContext context = JAXBContext.newInstance(Operation.class);

    System.out.println("Output from our XML File: ");
    Unmarshaller um = context.createUnmarshaller();
    Operation op = (Operation) um.unmarshal(new FileReader(xmlFilename));

    System.out.println("Operation-Content: " + op);
  }

}

Der Inhalt von

Paket stackoverflow.problem.jaxb.ns;

import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="Operation", namespace="http://www.test.com")
@XmlAccessorType(XmlAccessType.FIELD)

public class Operation {

  @XmlElement(name = "Parameter", namespace="http://www.test.com")
  List<Parameter> parameterList;

  @Override
  public String toString(){
    String retVal = "";
    for(Parameter currentParameter: parameterList){
      retVal += currentParameter.toString() + "\n";
    }   
    return retVal;
  }
}

Und der Inhalt von Parameter.java ist:

package stackoverflow.problem.jaxb.ns;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlType(namespace="http://www.test.com", name = "", propOrder = {"name", "description"})
@XmlAccessorType(XmlAccessType.FIELD)
public class Parameter {

  //@XmlElement(name = "name", namespace="http://www.test.com")
  String name;

  //@XmlElement(name = "description", namespace="http://www.test.com")
  String description;

  @Override
  public String toString(){
    return this.name + "\t" + this.description;
  }
}

Wenn ich die beiden @XmlElement-Zeilen im letzten Codeblock (Parameter.java) auskommentiere, funktioniert das Unmarshalling problemlos. Wenn diese beiden Zeilen nicht eingefügt werden, sind beide Felder im Parameter-Objekt null. Gibt es eine andere Möglichkeit, einen Namespace zu deklarieren, wenn propOrder in XmlType verwendet wird? Oder habe ich etwas anderes falsch gemacht?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X