2015-11-02 9 views
2

У меня возникли проблемы с добавлением нового узла в существующий xml. Поэтому у меня есть этот код для создания первого элементаКак добавить новый узел в существующий XML

Здесь я настройки полей

import java.util.*; 
import javax.xml.bind.annotation.*; 


@XmlRootElement (name = "books") 
class Books { 
    private ArrayList<Book> books; 
    public Books(){ 
     books = new ArrayList<>(); 
    } 

    public void add(Book book){ 
     books.add(book); 
    } 

    @XmlElement(name = "book") 
    public List<Book> getBooks() { 
     return books; 
    } 
} 

@XmlRootElement(name = "Book") 
class Book { 
    // поля 
    @XmlAttribute(name="ganre") 
      String ganre; 
    @XmlElement 
    String bookName; 
    @XmlElement 
    String bookAuthor; 
    @XmlElement 
    int bookId; 
    @XmlElement 
    int bookYear; 
    @XmlElement 
    boolean bookAvailable; 

    public Book(){ 

    } 

    public Book(String ganre, int bookId, String bookName, String bookAuthor, int bookYear, boolean bookAvailable){ // Конструктор чтобы быстрее создавать новые книги не напрягаясь 
     setGanre(ganre); 
     setBookId(bookId); 
     setBookName(bookName); 
     setBookAuthor(bookAuthor); 
     setBookYear(bookYear); 
     setBookAvailable(bookAvailable); 
    } 

    String getGanre(){ 
     return this.ganre; 
    } 

    void setGanre(String ganre){ 
     this.ganre = ganre; 
    } 

    String getBookName(){ 
     return this.bookName; 
    } 

    void setBookName(String bookName){ 
     this.bookName = bookName; 
    } 

    String getBookAuthor(){ 
     return this.bookAuthor ; 
    } 

    void setBookAuthor (String bookAuthor){ 
     this.bookAuthor = bookAuthor; 
    } 

    boolean getBookAvailable(){ 
     return this.bookAvailable; 
    } 

    void setBookAvailable(boolean bookAvailable){ 
     this.bookAvailable = bookAvailable; 
    } 

    int getBookId(){ 
     return this.bookId; 
    } 

    void setBookId(int bookId){ 
     this.bookId = bookId; 
    } 

    int getBookYear(){ 
     return this.bookYear; 
    } 


    void setBookYear(int bookYear){ 
     this.bookYear = bookYear; 
    } 
} 

Здесь я создание узлу

import org.xml.sax.SAXException; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Marshaller; 
import javax.xml.parsers.ParserConfigurationException; 
import java.io.File; 
import java.io.IOException; 

public class TestingTest { 
    public static void main (String[] args) throws InterruptedException, ParserConfigurationException, SAXException, IOException, JAXBException { 
     File file = new File("D:\\books.xml"); 
     Books bks = new Books(); 
     bks.add(new Book( 
       "fantasy", 
       7111, 
       "Tron", 
       "Brawm", 
       15, 
       true 
     )); 

     JAXBContext jaxbContext = JAXBContext.newInstance(Books.class); 
     Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 
     jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     jaxbMarshaller.marshal(bks,file); 

}} 

Так Im пытается сделать переписать существующий файл и добавить новый узел в конец, но всегда просто переписывание первого узла

intput

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<books> 
    <book ganre="fantasy"> 
     <bookName>Tron</bookName> 
     <bookAuthor>Brawm</bookAuthor> 
     <bookId>7111</bookId> 
     <bookYear>15</bookYear> 
     <bookAvailable>true</bookAvailable> 
    </book> 

, что я хочу видеть после

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<books> 
    <book ganre="fantasy"> 
     <bookName>Tron</bookName> 
     <bookAuthor>Brawm</bookAuthor> 
     <bookId>7111</bookId> 
     <bookYear>15</bookYear> 
     <bookAvailable>true</bookAvailable> 
    </book> 
    <book ganre="action"> 
     <bookName>Corn</bookName> 
     <bookAuthor>Down</bookAuthor> 
     <bookId>312</bookId> 
     <bookYear>23</bookYear> 
     <bookAvailable>false</bookAvailable> 
    </book> 
</books> 
+0

Было бы полезно добавить фактический XML и результат XML, который вы хотите достичь. Также я не вижу, где вы читаете и размонтируете существующий XML. – Rhayene

+0

добавил результат, и чего я хочу добиться. – TheOriginalNickname

ответ

0

Я думаю, что в коде используется файл только для записи операций.

Что вам нужно сделать, это разобрать текущий контент, добавить запись в книгу и отменить его.

Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
Books books = (Books) jaxbUnmarshaller.unmarshal(file); 
books.add(book); 
jaxbMarshaller.marshal(bks,file); 

Frank.

0

Чтобы добавить новую книгу в существующий файл сначала нужно распаковать в XML:

JAXBContext context = JAXBContext.newInstance(Books.class); 
Unmarshaller unmarshaller = context.createUnmarshaller(); 
Books books = (Books) unmarshaller.unmarshal(xmlFile); 

После этого нужно добавить новую книгу в свой список в книгах:

List<Book> bookList = books.getBooks(); 
bookList.add(newBook); 

Теперь вы можете маршалировать эти модифицированные Книги, как вы уже сделали, с новым:

Marshaller marshaller = context.createMarshaller(); 
marshaller.marshal(books, xmlFile); 
Смежные вопросы