Вопрос по xml, jaxb, java – Распаковка XML с использованием JAXB

5

Я прошел почти все вопросы, связанные с этой темой здесь. Но не смог найти правильного решения.

My issue is as follows:

Я создал простую программу, чтобы разобрать xml-файл, для которого у меня был xsd. Я смог сделать это успешно. Но если я получаю XML без XSD, как я могу получить свои атрибуты, если XML выглядит примерно так:

<items>
  <item>
    <code>12000</code>
    <name>Samsung  620</name>
    <price>9999</price>
  </item>
  <item>
    <code>15000</code>
    <name>NOKIA</name>
    <price>19999</price>
  </item>
  <item>
    <code>18000</code>
    <name>HTC 620</name>
    <price>29999</price>
  </item>
</items> 

Здесь у меня нет xsd для генерации моих классов. Как я могу продолжить? Пожалуйста, помогите мне.

Благодарю вас

Ваш Ответ

2   ответа
2

If you want to stick with JAXBВы можете либо написать документ XML-схемы самостоятельно для проверки такого XML (это выглядит просто, но это всего лишь экземпляр, вам нужно заранее выяснить, что может измениться в этом документе), либо создать POJO сJAXB аннотации сопоставляя эти узлы. Боюсь, другого пути нет. Вы все еще должны хорошо знать, что позволяет формат.

5

Ниже приведен один из способов сопоставления вашего варианта использования сJAXB (JSR-222) реализация:

Items

Мы будем использовать следующий класс для корневого объекта и аннотировать его@XmlRootElement,@XmlRootElement аннотация говорит JAXB, что этот класс должен быть создан, если корневой элемент в документе, который не распакован,itemsВы также можете указать другое имя@XmlRootElement(name="foo").

package forum11152046;

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

@XmlRootElement
public class Items {

    private List<Item> items;

    @XmlElement(name="item")
    public List<Item> getItems() {
        return items;
    }

    public void setItems(List<Item> items) {
        this.items = items;
    }

}

Item

В этом примере я создал класс, в котором все имена свойств напрямую соответствуют именам в документе XML. Это означает, что нет никаких аннотаций, которые необходимо добавить. Если вам нужно переопределить имя по умолчанию, вы можете использовать аннотацию, такую как@XmlElement сделать это. Я использовал@XmlElement аннотация, чтобы сделать это вItems класс дляitems имущество.

package forum11152046;

public class Item {

    private int code;
    private String name;
    private int price;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

}

Demo

package forum11152046;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Items.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum11152046/input.xml");
        Items items = (Items) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(items, System.out);
    }

}

input.xml/Output

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<items>
    <item>
        <code>12000</code>
        <name>Samsung  620</name>
        <price>9999</price>
    </item>
    <item>
        <code>15000</code>
        <name>NOKIA</name>
        <price>19999</price>
    </item>
    <item>
        <code>18000</code>
        <name>HTC 620</name>
        <price>29999</price>
    </item>
</items>
Всегда есть ответ от Блеза Дафана. Я думаю, что я должен использовать MOXy вместо JAXB-RI.

Похожие вопросы