Я пытаюсь прочитать XML-документ и декодировать его в Java Beans. У меня есть часть чтения, но я столкнулся с проблемой. Я в основном пытаюсь декодировать все дочерние узлы XML-документа, а root - «каталог». Как это сделать с помощью XMLDecoder?JAXB Чтение XML-документа
XMLDecoder:
private static Book jaxbXMLToObject() {
try {
JAXBContext context = JAXBContext.newInstance(Book.class);
Unmarshaller un = context.createUnmarshaller();
Book book = (Book) un.unmarshal(new File("PATH"));
return book;
} catch (JAXBException e) {
e.printStackTrace();
}
return null;
}
Я пытаюсь прочитать в следующем документе
<?xml version="1.0"?>
<catalog>
<book id="1">
<author>Isaac Asimov</author>
<title>Foundation</title>
<genre>Science Ficition</genre>
<price>164</price>
<publish_date>1951-08-21</publish_date>
<description>Foundation is the first novel in Isaac Asimovs Foundation Trilogy (later expanded into The Foundation Series). Foundation is a cycle of five interrelated short stories, first published as a single book by Gnome Press in 1951. Collectively they tell the story of the Foundation, an institute to preserve the best of galactic civilization after the collapse of the Galactic Empire.</description>
</book>
</catalog>
И Разобрать его к книге Object
@XmlRootElement(name = "book")
@XmlType(propOrder = {"id", "price", "title", "author", "genre", "description"})
public class Book {
private int id;
private int price;
private String title;
private String author;
private String genre;
private String description;
private Date publish_date;
public Book() {
}
...... Я получаю сообщение об ошибке: jjavax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"catalog"). Expected elements are <{}book>
Как получить доступ к дочерним узлам с помощью JAXB?
UPDATE
Каталог Класс:
@XmlRootElement(name = "catalog")
public class Catalog {
@XmlElement(name = "book")
List<Book> books;
public List<Book> getBooks() {
return books;
}
public void setBooks(List<Book> books) {
this.books = books;
}
}
класс Книга:
@XmlAccessorType(XmlAccessType.FIELD)
public class Book {
@XmlAttribute
int id;
private int price;
private String title;
private String author;
private String genre;
private String description;
private Date publish_date;
public Book() {
}
public Book(int id, int price, String title, String genre, String description, Date publicationDate) {
this.id = id;
this.price = price;
this.title = title;
this.genre = genre;
this.description = description;
this.publish_date = publicationDate;
}
public int getId() {
return id;
}
public int getPrice() {
return price;
}
public String getTitle() {
return title;
}
public String getGenre() {
return genre;
}
public String getDescription() {
return description;
}
public Date getPublicationDate() {
return publish_date;
}
public void setId(int id) {
this.id = id;
}
public void setPrice(int price) {
this.price = price;
}
public void setTitle(String title) {
this.title = title;
}
public void setGenre(String genre) {
this.genre = genre;
}
public void setDescription(String description) {
this.description = description;
}
public void setPublish_date(String publish_date) {
this.publish_date = new Date();
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public Date getPublish_date() {
return publish_date;
}
public String toJSON() {
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.writeValueAsString(this);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
public String toString() {
return "Book{" +
"id=" + id +
", price=" + price +
", title='" + title + '\'' +
", genre='" + genre + '\'' +
", description='" + description + '\'' +
", publicationDate=" + publish_date +
'}';
}
}
DAO:
public class BooksDAO {
public BooksDAO() {
}
public List<Book> getBooks() {
Catalog catalog = jaxbXMLToObject();
return catalog.getBooks();
}
private static Catalog jaxbXMLToObject() {
try {
return JAXB.unmarshal(new File("PATH"), Catalog.class);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
Когда вы уже используете Джексон - это вариант для использования Джексона с расширением XML-данных для чтения XML? Или, может быть, JAXB? Использование XMLDecoder просто не будет работать здесь, поскольку оно предназначено для использования в качестве аналога XMLEncoder, который передает XML, специфичный для родовой сериализации/десериализации. –
JAXB тоже можно понять, как бы я это делал?Я пытаюсь сделать это с помощью JAXB сейчас, но я все еще получаю эту глупую проблему с каталогом, когда я пытаюсь извлечь книги. – Lithicas
Ну, корневой элемент вашего XML-документа не является Bok. Это каталог. И в каталоге есть книга (или, может быть, несколько, в более реалистичном примере). Поэтому создайте класс Catalog, содержащий Список. Поднимите документ в каталог (а не книгу). И получить книгу (ы) из возвращаемого объекта Catalog. TL; DR: убедитесь, что структура Java Bean соответствует структуре XML. –