2016-10-08 5 views
0

Мне нужно создать XML-файл со следующей структурой:JAXB: Создать атрибут для внутреннего элемента

<Persons> 
    <Person ID="1"> 
     <Name></Name> 
     ... 
    </Person> 
    <Person ID="2"> 
     <Name></Name> 
     ... 
    </Person> 
    ... 
</Persons> 

Я уже перепробовал все решения на переполнение стека, используя *@XmlPath("/Person/@ID")*, *@XmlAttribute(name="ID")* по-разному и не имели никакого успеха. Мой код создает атрибут в корневом узле или создает дополнительный узел до Лицо узел. Но атрибут должен быть внутри Person узел

Метод в Main.class:

public void savePersonDataToFile(File file) { 
    try { 
     JAXBContext context = JAXBContext 
       .newInstance(PersonListXMLWrapper.class); 
     Marshaller m = context.createMarshaller(); 
     m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 

     // Wrapping our person data. 
     PersonListXMLWrapper wrapper = new PersonListXMLWrapper(); 
     wrapper.setPersons(personData); 

     // Marshalling and saving XML to the file. 
     m.marshal(wrapper, file); 

     // Save the file path to the registry. 
     setPersonFilePath(file); 
    } catch (Exception e) { // catches ANY exception 
     Alert alert = new Alert(AlertType.ERROR); 
     alert.setTitle("Error"); 
     alert.setHeaderText("Cant save to file:\n" + file.getPath()); 
     alert.setContentText("Ooops, there was an error!"); 
    } 
} 

Person.class имеет объявления переменных, методы для изменения и получать их и конструктор:

public class Person { 
    private final IntegerProperty ID; 
    private final StringProperty name; 
    private final StringProperty surname; 
    private final StringProperty prevSurname; 
    private final StringProperty patronymic; 
    ... 

PersonListXMLWrapper . класс:

@XmlRootElement(name = "Persons") 
public class PersonListXMLWrapper { 

    private List<Person> persons; 

    @XmlElement(name = "Person") 
    public List<Person> getPersons() { 
     return persons; 
    } 

    public void setPersons(List<Person> persons) { 
     this.persons = persons; 
    } 


    @XmlPath("/Person/@IDAtt") 
    public String IDAtt ="123"; 

    @XmlAttribute(name="ID") 
    public String getID() { 
     return IDAtt; 
    } 

    public void setID(String ID) { 
     this.IDAtt = ID; 
    } 
} 
+0

Пробовали ли вы ElementWrapper как следующее @XmlElementWrapper (имя = "persons") @XmlElement (name = "person") Список человек; –

ответ

0

Решение было предельно простым. Я просто должен был добавить *@XmlAttribute(name="ID")* методу декларации в Person.class, вместо PersonListXMLWrapper.class:

public class Person { 
    private final StringProperty ID; 
    private final StringProperty name; 
    private final StringProperty surname; 
    private final StringProperty prevSurname; 
    private final StringProperty patronymic; 
    ... 

    @XmlAttribute(name="ID") 
    public String getID() { 
     return ID.get(); 
    } 
    public void setID(String ID) { 
     this.ID.set(ID); 
    } 

    public StringProperty IDProperty() { 
     return ID; 
    } 

Так я получаю следующую структуру:

<Persons> 
    <Person ID="1"> 
     <name>Name1</name> 
     <surname></surname> 
     <prevSurname></prevSurname> 
     <patronymic></patronymic> 
     ... 
    </Person> 
    <Person ID="2"> 
     <name>Name2</name> 
     <surname></surname> 
     <prevSurname></prevSurname> 
     <patronymic></patronymic> 
     ... 
    </Person> 
    ... 
</Persons> 
0

Если вы можете использовать другой синтаксический анализатор XML, я бы рекомендовал Scilca XML Progression для написания простого XML-файла (его проверки).

import org.scilca.sxp.*; // The SXP package 

Node rootNode = new XMLNode("Persons"); 

// First Persion 
Node p1 = Node.constructNode("<Person Id=\"1\"?"); 
p1.add("Name").setValue("Jacob"); // Add a child element and set its value 
p1.add("Habit").setValue("Eating"); 

rootNode.add(p1); // Add it to root node 

// Second Person 
Node p2 = Node.constructNode("<Person Id=\"2\">"); 
p1.add("Name").setValue("Jacks"); 

rootNode.add(p2); 

Document XmlDocument = new Document(rootNode); 
XmlWriter xw = XmlDocument.getWriter(); 
xw.saveXml("D:/file.txt"); // text file to see if the file is correct 
+0

Я пробовал его полчаса, но абсолютно без всякого смысла. Вы уверены, что это открытый доступ? – Strs

+0

Извините! Создатель удалил его из GitHub. –