Я не могу получить доступ к пространству имен - PullRequest
0 голосов
/ 03 апреля 2020

Все в названии. Я новичок в Jaxb и в XML. Я могу получить доступ к другим пространствам имен, таким как

или et c ... Но пространства имен с или я не могу. Вы можете помочь мне? Я немного растерялся. Все, что у меня есть, это нулевые данные, я не могу найти путь.

Вот код:

Класс фида:

@XmlRootElement(name = "feed")
@XmlAccessorType(XmlAccessType.FIELD)
  public class Feed {

    @XmlElement(name = "entry")
    private List<Entry> entries;

    public List<Entry> getEntries() {
        return this.entries;
    }

}

Класс входа:

@XmlRootElement(name = "entry")
@XmlAccessorType(XmlAccessType.FIELD)
public class Entry {
    //@XmlElement(name = "footprint")//<str name="footprint"> dont work.
    //@XmlAttribute(name="footprint")//dont work
    //@XmlValue//dont work
    private String footprint;

    @XmlElement(name = "uuid")
    private String id;

    @XmlElement(name = "size")
    private String size;

    public Entry() {}

    public String getCoordinates() {
        return footprint;
    }

    public String getId() {
        return id;
    }

    public String getSize() {
        return size;
    }

    public void setCoordinates(String footprint) {
        this.footprint=footprint;
    }
    public void setSize(String size) {
        this.size=size;
    }
    public void setId(String id) {
        this.id=id;
    }

}

XML:

первая часть

вторая часть

Спасибо!

1 Ответ

0 голосов
/ 03 апреля 2020

Вы можете использовать аннотацию @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, например: enter image description here

Эта структура, очевидно, отличается от той, что вы ищу создать в вашем вопросе. Но все данные перехвачены, и он использует jaxb, как и было запрошено.

Могут существовать альтернативные подходы, которые могут напрямую поддерживать макет вашего компонента - например, подход StAX, когда вы заполняете каждый компонент как XML отсканированным тегом за тегом. Это имеет свои очевидные недостатки (например, ручная популяция бобов).

...