Не уверен, насколько вы привязаны к XStream, но MOXy JAXB предлагает тип отображения, который вы ищете.Ниже приведена частичная выборка того, как ваш объект может быть отображен:
package-info.java (для установки аннотаций на уровне пакета)
Префиксы пространства имен, назначенные здесь, будутиспользуется позже.
@XmlSchema(
namespace = "http://www.netbeans.org/ns/project/1",
xmlns = {
@javax.xml.bind.annotation.XmlNs(prefix = "f", namespaceURI = "http://www.netbeans.org/ns/freeform-project/1"),
},
elementFormDefault = XmlNsForm.QUALIFIED)
@XmlAccessorType(XmlAccessType.FIELD)
package example;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
Project.java
Обратите внимание на использование @XmlPath для разрыва зависимости 1-к-1 между классами и узлами.
package example;
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import org.eclipse.persistence.oxm.annotations.XmlPath;
@XmlRootElement
@XmlType(propOrder={"type", "propertyFile", "name"})
public class Project {
private String type;
@XmlPath("configuration/f:general-data/f:properties/f:property-file/text()")
private List<String> propertyFile;
@XmlPath("configuration/f:general-data/f:name/text()")
private String name;
@XmlPath("configuration/f:general-data/f:folders/f:source-folder")
private List<Folder> sourceFolder;
@XmlPath("configuration/f:general-data/f:ide-actions/f:action")
private List<Action> action;
}
Folder.java
package example;
import javax.xml.bind.annotation.XmlType;
@XmlType(namespace="http://www.netbeans.org/ns/freeform-project/1")
public class Folder {
private String label;
private String type;
private String location;
}
Action.java
package example;
import java.util.List;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlType;
@XmlType(namespace="http://www.netbeans.org/ns/freeform-project/1")
public class Action {
@XmlAttribute
private String name;
private List<String> target;
}
Demo.java
package example;
import java.io.FileInputStream;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Project.class);
FileInputStream xml = new FileInputStream("src/forum32/input.xml");
Project project = (Project) jc.createUnmarshaller().unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(project, System.out);
}
}
Чтобы использовать MOXy JAXB, вам нужно добавить файл jaxb.properties в классы вашей модели со следующей записью:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory