Вы можете использовать аннотацию @XmlAttribute
- поскольку данные, к которым вы обращаетесь, являются атрибутами. Атрибут имеет имя и значение - ваш пример:
<str name="footprint">
В этом примере имя атрибута равно name
, а его значение равно "footprint"
.
Так что аннотации нужны быть:
@XmlAttribute(name="name")
Однако, поскольку ваш XML содержит несколько атрибутов name
, JAXB создаст каждый из них как отдельный объект - список пар имя-значение.
Для следующего упрощенного представления вашего XML ...
<feed>
<entry>
<str name="footprint">Some very long string of data in here.</str>
<str name="format">SAFE</str>
</entry>
</feed>
... у нас есть следующие три связанных класса:
Класс подачи
@XmlRootElement(name = "feed")
@XmlAccessorType(XmlAccessType.FIELD)
public class FeedType {
@XmlElement(required = true)
protected EntryType entry;
public EntryType getEntry() {
return entry;
}
public void setEntry(EntryType value) {
this.entry = value;
}
}
Вступительный класс:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "entry")
public class EntryType {
@XmlElement(required = true)
protected List<StrType> str;
public List<StrType> getStr() {
if (str == null) {
str = new ArrayList<>();
}
return this.str;
}
}
Str класс:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "str")
public class StrType {
@XmlAttribute(name = "name")
private String name;
@XmlValue
private String data;
public String getName() {
return name;
}
public void setName(String value) {
this.name = value;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
Тогда, неустрашимый выглядит следующим образом:
JAXBContext jc = JAXBContext.newInstance(FeedType.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("path/to/your/sample.xml");
FeedType feed = (FeedType) unmarshaller.unmarshal(xml);
Это создает список объектов StrType, например:
Эта структура, очевидно, отличается от той, что вы ищу создать в вашем вопросе. Но все данные перехвачены, и он использует jaxb, как и было запрошено.
Могут существовать альтернативные подходы, которые могут напрямую поддерживать макет вашего компонента - например, подход StAX, когда вы заполняете каждый компонент как XML отсканированным тегом за тегом. Это имеет свои очевидные недостатки (например, ручная популяция бобов).