Как правильно сгенерировать XML с помощью JAXB в JAVA - PullRequest
0 голосов
/ 05 мая 2019

может быть, мой вопрос похож на этот вопрос
Как мне проанализировать этот XML в Java с JAXB?
Я хочу сгенерировать некоторые XML-файлы для отображения некоторых данных, но у меня другая проблемас использованием некоторых @ XmlAttribute & @ XmlValue должным образом в JAXB
это вывод XML , который должен быть:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AnlKerja>
    <Analisa no="1">
        <Kode>B.1</Kode>
        <Uraian>some description</Uraian>
        <Material>
            <item type="value">ID|ID|ID</item>
        </Material>
        <Jumlah>some value</Jumlah>
    </Analisa>
    <Analisa no="2">
        <Kode>B.3</Kode>
        <Uraian>some description</Uraian>
        <Material>
            <item type="value">ID|ID|ID</item>
            <item type="value">ID|ID|ID</item>
        </Material>
        <Jumlah>some value</Jumlah>
    </Analisa>
</AnlKerja>

, поскольку я использую JAXB 2 дня назад, я не знаю, как правильно его использовать, и мне довольно сложно прочитать руководство по документации JAXB, потому что мой родной язык не английский.это мой код Java для JAXB

AnlKerja.java

@XmlRootElement(name = "AnlKerja")
public class AnlKerja {
    @XmlElementWrapper(name = "Analisa")
    @XmlElement(name = "Analisa")
    private ArrayList<Analisa> analisa;

    public ArrayList<Analisa> getAnl() {
        return analisa;
    }

    public void setAnl(ArrayList<Analisa> anl) {
        this.analisa = anl;
    }
}

Analisa.java

@XmlRootElement(name="Analisa")
@XmlType(propOrder = {"no","value","kode","uraian","material","jumlah"})
public class Analisa {


    @XmlAttribute
    private String no;
    public String getNo() {
        return no;
    }

    public void setNo(String no) {
        this.no = no;
    }

    @XmlValue
    private int value;
    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    private String kode,uraian;
    private double jumlah;

    @XmlElement(name="Kode")
    public String getKode() {
        return kode;
    }

    public void setKode(String kode) {
        this.kode = kode;
    }
     @XmlElement(name="Uraian")
    public String getUraian() {
        return uraian;
    }

    public void setUraian(String uraian) {
        this.uraian = uraian;
    }
    @XmlElementWrapper(name = "material")
    private ArrayList<Material> material;
    public ArrayList<Material> getMaterial() {
        return material;
    }

    public void setMaterial(ArrayList<Material> material) {
        this.material = material;
    }
     @XmlElement(name="Jumlah")
    public double getJumlah() {
        return jumlah;
    }

    public void setJumlah(double jumlah) {
        this.jumlah = jumlah;
    }
}

Material.java

@XmlRootElement(name = "Material")
public class Material {
    @XmlElement(name = "items")
    private String items;

    public Material() {
        this.items = "";
        this.tipe = "";
        this.value = "";
    }
    public Material(String[] isi, String tipe, String deskripsi) {
        int temp = isi.length;
        for (int x=0; x<temp; x++) {
            this.items += isi[x]+"|";
        };
        this.value = deskripsi;
        this.tipe = tipe;
    }
    public String getItems() {
        return items;
    }

    public void setItems(String items) {
        this.items = items;
    }
    public void setItems(String[] items) {
        int temp = items.length;
        for (int x=0; x<temp; x++) {
            this.items += items[x]+"|";
        }
    }

    @XmlAttribute
    private String tipe;
    public String getTipe() {
        return tipe;
    }

    public void setTipe(String tipe) {
        this.tipe = tipe;
    }

    @XmlValue
    private String value;
    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

Demo.java

public class Demo {
    private static final String STORE_XML = "results/ANL.xml";

    public static void main(String[] args) throws JAXBException, IOException{
        ArrayList<Material> mtr = new ArrayList<Material>();
        ArrayList<Analisa> anl = new ArrayList<Analisa>();
        AnlKerja anKerja = new AnlKerja();

        Material mat = new Material();
        mat.setTipe("tipe");
        mat.setValue("Bahan");
        mat.setItems("MT001|MT002|MT003");
        mtr.add(mat);
        mat.setTipe("tipe");
        mat.setValue("Tenaga");
        mat.setItems("MT0001|MT0002|MT0003");
        mtr.add(mat);

        Analisa ana = new Analisa();
        ana.setNo("no");
        ana.setValue(1);
        ana.setKode("B.1");
        ana.setUraian("some description");
        ana.setMaterial(mtr);
        ana.setJumlah(122414.03);
        anl.add(ana);

        anKerja.setAnl(anl);

        JAXBContext jCont = JAXBContext.newInstance(AnlKerja.class);
        Marshaller marshal = jCont.createMarshaller();
        marshal.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

        marshal.marshal(anKerja, System.out);

        marshal.marshal(anKerja, new File(STORE_XML));
    }
}

это ошибка, которую я получаю

Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 8 counts of IllegalAnnotationExceptions
If a class has @XmlElement property, it cannot have @XmlValue property.
    this problem is related to the following location:
        at private int XML.Analisa.value
        at XML.Analisa
        at private java.util.ArrayList XML.AnlKerja.analisa
        at XML.AnlKerja
    this problem is related to the following location:
        at public int XML.Analisa.getValue()
        at XML.Analisa
        at private java.util.ArrayList XML.AnlKerja.analisa
        at XML.AnlKerja
If a class has @XmlElement property, it cannot have @XmlValue property.
    this problem is related to the following location:
        at private java.lang.String XML.Material.value
        at XML.Material
        at private java.util.ArrayList XML.Analisa.material
        at XML.Analisa
        at private java.util.ArrayList XML.AnlKerja.analisa
        at XML.AnlKerja
    this problem is related to the following location:
        at public java.lang.String XML.Material.getValue()
        at XML.Material
        at private java.util.ArrayList XML.Analisa.material
        at XML.Analisa
        at private java.util.ArrayList XML.AnlKerja.analisa
        at XML.AnlKerja
Class has two properties of the same name "material"
    this problem is related to the following location:
        at public java.util.ArrayList XML.Analisa.getMaterial()
        at XML.Analisa
        at private java.util.ArrayList XML.AnlKerja.analisa
        at XML.AnlKerja
    this problem is related to the following location:
        at private java.util.ArrayList XML.Analisa.material
        at XML.Analisa
        at private java.util.ArrayList XML.AnlKerja.analisa
        at XML.AnlKerja
Class has two properties of the same name "no"
    this problem is related to the following location:
        at public java.lang.String XML.Analisa.getNo()
        at XML.Analisa
        at private java.util.ArrayList XML.AnlKerja.analisa
        at XML.AnlKerja
    this problem is related to the following location:
        at private java.lang.String XML.Analisa.no
        at XML.Analisa
        at private java.util.ArrayList XML.AnlKerja.analisa
        at XML.AnlKerja
Class has two properties of the same name "value"
    this problem is related to the following location:
        at public int XML.Analisa.getValue()
        at XML.Analisa
        at private java.util.ArrayList XML.AnlKerja.analisa
        at XML.AnlKerja
    this problem is related to the following location:
        at private int XML.Analisa.value
        at XML.Analisa
        at private java.util.ArrayList XML.AnlKerja.analisa
        at XML.AnlKerja
Class has two properties of the same name "items"
    this problem is related to the following location:
        at public java.lang.String XML.Material.getItems()
        at XML.Material
        at private java.util.ArrayList XML.Analisa.material
        at XML.Analisa
        at private java.util.ArrayList XML.AnlKerja.analisa
        at XML.AnlKerja
    this problem is related to the following location:
        at private java.lang.String XML.Material.items
        at XML.Material
        at private java.util.ArrayList XML.Analisa.material
        at XML.Analisa
        at private java.util.ArrayList XML.AnlKerja.analisa
        at XML.AnlKerja
Class has two properties of the same name "tipe"
    this problem is related to the following location:
        at public java.lang.String XML.Material.getTipe()
        at XML.Material
        at private java.util.ArrayList XML.Analisa.material
        at XML.Analisa
        at private java.util.ArrayList XML.AnlKerja.analisa
        at XML.AnlKerja
    this problem is related to the following location:
        at private java.lang.String XML.Material.tipe
        at XML.Material
        at private java.util.ArrayList XML.Analisa.material
        at XML.Analisa
        at private java.util.ArrayList XML.AnlKerja.analisa
        at XML.AnlKerja
Class has two properties of the same name "value"
    this problem is related to the following location:
        at public java.lang.String XML.Material.getValue()
        at XML.Material
        at private java.util.ArrayList XML.Analisa.material
        at XML.Analisa
        at private java.util.ArrayList XML.AnlKerja.analisa
        at XML.AnlKerja
    this problem is related to the following location:
        at private java.lang.String XML.Material.value
        at XML.Material
        at private java.util.ArrayList XML.Analisa.material
        at XML.Analisa
        at private java.util.ArrayList XML.AnlKerja.analisa
        at XML.AnlKerja

Ответы [ 2 ]

0 голосов
/ 05 мая 2019

Я нашел какое-то решение, но оно все еще не решило реальную проблему, с которой я столкнулся сейчас.я нашел этот урок ЗДЕСЬ
и немного изменил свой код

AnlKerja.java

@XmlRootElement
public class AnlKerja {
    private ArrayList<Analisa> analisa;
    // removed @XmlElementWrapper & @XmlElement
    public ArrayList<Analisa> getAnalisa() {
        return analisa;
    }
    public void setAnalisa(ArrayList<Analisa> anl) {
        this.analisa = anl;
    }
}

Analisa.java

размещениепеременная в правильном порядке и удалить @ XmlElement

    private String kode,uraian;
    private ArrayList<Material> material;
    private double jumlah;
    private String no;

удалено @XmlValue и переупорядочить @XmlAttribute для нижнего кода кода

    @XmlAttribute
    public String getNo() {
        return no;
    }
    public void setNo(String no) {
        this.no = no;
    }

Material.java

iсделал то же самое с материалом, удалите @XmlValue и его переменную
    @XmlAttribute
    public String getTipe() {
        return tipe;
    }
    public void setTipe(String tipe) {
        this.tipe = tipe;
    }

, а остальное я удаляю ana.setValue(1); из Demo.java
, и это результат, который я получаю для своегоXML-файлы.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<anlKerja>
    <analisa no="1">
        <kode>B.1</kode>
        <uraian>Some Description</uraian>
        <material tipe="Tenaga">
            <items>MT001|MT002|MT003</items>
        </material>
        <material tipe="Bahan">
            <items>MT0001|MT0002|MT0003</items>
        </material>
        <jumlah>122414.03</jumlah>
    </analisa>
</anlKerja>

это выглядит почти как то, что я хотел, но все же есть некоторый дочерний элемент, который я хотел изменить

<material tipe="Bahan">
    <items>MT0001|MT0002|MT0003</items>
</material>

на этот

<Material>
    <item type="Bahan">ID|ID|ID</item>
</Material>
Or this
<Material>
    <item type="Bahan">ID|ID|ID</item>
    <item type="Tenaga">ID|ID|ID</item>
</Material>

Должен ли я создать дополнительный класс для элемента?или настроить код в Material.java ?

0 голосов
/ 05 мая 2019
  1. Это XML, а не схема XML
  2. у вас есть ошибки в вашем XML-файле: элемент тега не закрыт в некоторых строках. После исправления вы можете создать XSD из XML на одном из онлайн-сервисов, например: https://www.freeformatter.com/xsd-generator.html
  3. С помощью вашего XSD-файла вы можете создавать классы привязки JAXB с помощью утилиты xjc (https://docs.oracle.com/javase/8/docs/technotes/tools/unix/xjc.html) из JDK

обновить сгенерированный класс:

<code>//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
// Any modifications to this file will be lost upon recompilation of the source schema. 
// Generated on: 2019.05.05 at 08:59:07 PM MSK 
//


package generated;

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.XmlValue;


/**
 * <p>Java class for anonymous complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType>
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element name="Analisa" maxOccurs="unbounded" minOccurs="0">
 *           &lt;complexType>
 *             &lt;complexContent>
 *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *                 &lt;sequence>
 *                   &lt;element name="Kode" type="{http://www.w3.org/2001/XMLSchema}string"/>
 *                   &lt;element name="Uraian" type="{http://www.w3.org/2001/XMLSchema}string"/>
 *                   &lt;element name="Material">
 *                     &lt;complexType>
 *                       &lt;complexContent>
 *                         &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *                           &lt;sequence>
 *                             &lt;element name="item" maxOccurs="unbounded" minOccurs="0">
 *                               &lt;complexType>
 *                                 &lt;simpleContent>
 *                                   &lt;extension base="&lt;http://www.w3.org/2001/XMLSchema>string">
 *                                     &lt;attribute name="type" type="{http://www.w3.org/2001/XMLSchema}string" />
 *                                   &lt;/extension>
 *                                 &lt;/simpleContent>
 *                               &lt;/complexType>
 *                             &lt;/element>
 *                           &lt;/sequence>
 *                         &lt;/restriction>
 *                       &lt;/complexContent>
 *                     &lt;/complexType>
 *                   &lt;/element>
 *                   &lt;element name="Jumlah" type="{http://www.w3.org/2001/XMLSchema}string"/>
 *                 &lt;/sequence>
 *                 &lt;attribute name="no" type="{http://www.w3.org/2001/XMLSchema}byte" />
 *               &lt;/restriction>
 *             &lt;/complexContent>
 *           &lt;/complexType>
 *         &lt;/element>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * 
* * * / @XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "", propOrder = { "Analisa" }) @XmlRootElement (name = "AnlKerja") открытый класс AnlKerja { @XmlElement (name = "Analisa") Защищенный список Analisa; / ** * Получает значение свойства analisa. * *

* Этот метод доступа возвращает ссылку на текущий список, * не снимок. Поэтому любые изменения, которые вы вносите в * возвращенный список будет присутствовать внутри объекта JAXB. * Вот почему нет метода set для свойства analisa. * *

* Например, чтобы добавить новый элемент, сделайте следующее: *

     *    getAnalisa().add(newItem);
     * 
* * *

* Объекты следующих типов разрешены в списке * {@link AnlKerja.Analisa} * * * / общедоступный список getAnalisa () { if (analisa == null) { analisa = новый ArrayList (); } вернуть this.analisa; } / ** *

Java-класс для анонимного сложного типа. * *

Следующий фрагмент схемы определяет ожидаемое содержимое, содержащееся в этом классе. * *

     * &lt;complexType>
     *   &lt;complexContent>
     *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
     *       &lt;sequence>
     *         &lt;element name="Kode" type="{http://www.w3.org/2001/XMLSchema}string"/>
     *         &lt;element name="Uraian" type="{http://www.w3.org/2001/XMLSchema}string"/>
     *         &lt;element name="Material">
     *           &lt;complexType>
     *             &lt;complexContent>
     *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
     *                 &lt;sequence>
     *                   &lt;element name="item" maxOccurs="unbounded" minOccurs="0">
     *                     &lt;complexType>
     *                       &lt;simpleContent>
     *                         &lt;extension base="&lt;http://www.w3.org/2001/XMLSchema>string">
     *                           &lt;attribute name="type" type="{http://www.w3.org/2001/XMLSchema}string" />
     *                         &lt;/extension>
     *                       &lt;/simpleContent>
     *                     &lt;/complexType>
     *                   &lt;/element>
     *                 &lt;/sequence>
     *               &lt;/restriction>
     *             &lt;/complexContent>
     *           &lt;/complexType>
     *         &lt;/element>
     *         &lt;element name="Jumlah" type="{http://www.w3.org/2001/XMLSchema}string"/>
     *       &lt;/sequence>
     *       &lt;attribute name="no" type="{http://www.w3.org/2001/XMLSchema}byte" />
     *     &lt;/restriction>
     *   &lt;/complexContent>
     * &lt;/complexType>
     * 
* * * / @XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "", propOrder = { "Kode", "Uraian", «Материал», "Jumlah" }) открытый статический класс Analisa { @XmlElement (name = "Kode", обязательно = true) защищенный строковый код; @XmlElement (name = "Uraian", обязательно = true) Защищенный Струнный Урайан; @XmlElement (name = "Material", обязательно = true) Защищено АнлКеря.Аналиса.Материал материала; @XmlElement (name = "Jumlah", обязательно = true) защищенный струнный джумла; @XmlAttribute (name = "no") защищенный байт нет; / ** * Получает значение свойства kode. * * @вернуть * возможный объект * {@link String} * * / public String getKode () { возвратный код; } / ** * Устанавливает значение свойства kode. * * @param value * разрешенный объект * {@link String} * * / public void setKode (String value) { this.kode = значение; } / ** * Получает значение свойства uraian. * * @вернуть * возможный объект * {@link String} * * / public String getUraian () { вернуть ураян; } / ** * Устанавливает значение свойства uraian. * * @param value * разрешенный объект * {@link String} * * / public void setUraian (String value) { this.uraian = значение; } / ** * Получает значение свойства материала. * * @вернуть * возможный объект * {@link AnlKerja.Analisa.Material} * * / public AnlKerja.Analisa.Material getMaterial () { возврат материала; } / ** * Устанавливает значение свойства материала. * * @param value * разрешенный объект * {@link AnlKerja.Analisa.Material} * * / public void setMaterial (AnlKerja.Analisa.Material value) { this.material = value; } / ** * Получает значение свойства jumlah.* * @вернуть * возможный объект * {@link String} * * / public String getJumlah () { вернуть джамлу; } / ** * Устанавливает значение свойства jumlah. * * @param value * разрешенный объект * {@link String} * * / public void setJumlah (String value) { this.jumlah = значение; } / ** * Получает значение свойства no. * * @вернуть * возможный объект * {@link Byte} * * / public Byte getNo () { возврат нет; } / ** * Устанавливает значение свойства no. * * @param value * разрешенный объект * {@link Byte} * * / public void setNo (Byte value) { this.no = значение; } / ** *

Java-класс для анонимного сложного типа. * *

Следующий фрагмент схемы определяет ожидаемое содержимое этого класса. * *

         * &lt;complexType>
         *   &lt;complexContent>
         *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
         *       &lt;sequence>
         *         &lt;element name="item" maxOccurs="unbounded" minOccurs="0">
         *           &lt;complexType>
         *             &lt;simpleContent>
         *               &lt;extension base="&lt;http://www.w3.org/2001/XMLSchema>string">
         *                 &lt;attribute name="type" type="{http://www.w3.org/2001/XMLSchema}string" />
         *               &lt;/extension>
         *             &lt;/simpleContent>
         *           &lt;/complexType>
         *         &lt;/element>
         *       &lt;/sequence>
         *     &lt;/restriction>
         *   &lt;/complexContent>
         * &lt;/complexType>
         * 
* * * / @XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "", propOrder = { "вещь" }) открытый статический класс Material { защищенный элемент списка ; / ** * Получает значение свойства элемента. * *

* Этот метод доступа возвращает ссылку на текущий список, * не снимок. Поэтому любые изменения, которые вы вносите в * возвращенный список будет присутствовать внутри объекта JAXB. * Вот почему нет метода set для свойства элемента. * *

* Например, чтобы добавить новый элемент, сделайте следующее: *

             *    getItem().add(newItem);
             * 
* * *

* Объекты следующих типов разрешены в списке * {@link AnlKerja.Analisa.Material.Item} * * * / открытый список getItem () { if (item == null) { item = new ArrayList (); } вернуть этот предмет; } / ** *

Java-класс для анонимного сложного типа. * *

Следующий фрагмент схемы определяет ожидаемое содержимое этого класса. * *

             * &lt;complexType>
             *   &lt;simpleContent>
             *     &lt;extension base="&lt;http://www.w3.org/2001/XMLSchema>string">
             *       &lt;attribute name="type" type="{http://www.w3.org/2001/XMLSchema}string" />
             *     &lt;/extension>
             *   &lt;/simpleContent>
             * &lt;/complexType>
             * 
* * * / @XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "", propOrder = { "значение" }) открытый статический класс Item { @XmlValue защищенное строковое значение; @XmlAttribute (name = "type") защищенный тип String; / ** * Получает значение свойства value. * * @вернуть * возможный объект * {@link String} * * / public String getValue () { возвращаемое значение; } / ** * Устанавливает значение свойства value. * * @param value * разрешенный объект * {@link String} * * / public void setValue (String value) { this.value = значение; } / ** * Получает значение свойства type. * * @вернуть * возможный объект * {@link String}* * / public String getType () { тип возврата; } / ** * Устанавливает значение свойства type. * * @param value * разрешенный объект * {@link String} * * / public void setType (String value) { this.type = value; } } } } }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...