XMLDecoder ›› java.lang.IllegalArgumentException: องค์ประกอบที่ไม่รองรับ

ได้รับข้อผิดพลาดนี้

java.lang.IllegalArgumentException: องค์ประกอบที่ไม่รองรับ: net

จากไฟล์ xml ตัวอย่างนี้

<?xml version="1.0" encoding="UTF-8"?>
    <net>
       <node label="A">
        ...
       </node>
       <node label="B">
        ...
       </node>
       <node label="C">
        ...
       </node>
    </net>

ด้วยบรรทัดโค้ด Java เหล่านี้

    ...
    FileInputStream file = new FileInputStream("example.xml");
    XMLDecoder decoder = new XMLDecoder(file);
    Object decodedResistors = (Object) decoder.readObject();
    file.close();
    ...



คำตอบ (1)


อย่าใช้ java.beans.XMLDecoder สำหรับเพย์โหลด XML แบบกำหนดเองสำหรับการดีซีเรียลไลเซชัน มันไม่ได้ออกแบบมาเพื่อสิ่งนั้น อ่านบทความ Long Term Persistence of JavaBeans Components: XML Schema ประกอบด้วยตัวอย่าง XML เพย์โหลดซึ่งสามารถดีซีเรียลไลซ์กลับได้โดย XMLDecoder:

<?xml version="1.0" encoding="UTF-8" ?>
<java version="1.4.0" class="java.beans.XMLDecoder">
    <void id="myController" property="owner"/>
    <object class="javax.swing.JButton">
        <void method="addActionListener">
            <object class="java.beans.EventHandler" method="create">
                <class>java.awt.event.ActionListener</class>
                <object idref="myController"/>
                <string>doIt</string>
            </object>
        </void>
    </object>
</java>

หากคุณต้องการดีซีเรียลไลซ์แบบกำหนดเอง XML ให้ใช้ JAXB หรือ Jackson XML คุณต้องสร้างโมเดล POJO พร้อมด้วยคำอธิบายประกอบ JAXB:

@XmlRootElement(name = "net")
@XmlAccessorType(XmlAccessType.FIELD)
class Net {

    @XmlElement(name = "node")
    private List<Node> nodes;

    // getters, setters, toString
}

@XmlAccessorType(XmlAccessType.FIELD)
class Node {

    @XmlAttribute
    private String label;

    // getters, setters, toString
}

ตัวอย่างการใช้งาน:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
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 java.io.File;
import java.util.List;

public class JaxbApp {

    public static void main(String[] args) throws Exception {
        File xmlFile = new File("./resource/test.xml").getAbsoluteFile();

        JAXBContext jaxbContext = JAXBContext.newInstance(Net.class);
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
        Object net = unmarshaller.unmarshal(xmlFile);
        System.out.println(net);
    }
}

พิมพ์:

Net{nodes=[Node{label='A'}, Node{label='B'}, Node{label='C'}]}

ดูสิ่งนี้ด้วย:

person Michał Ziober    schedule 19.03.2019
comment
ตอนนี้ฉันได้รับข้อยกเว้นใน JAXBContext jaxbContext = JAXBContext.newInstance(Net.class); ข้อยกเว้นในเธรด main javax.xml.bind.JAXBException - พร้อมข้อยกเว้นที่เชื่อมโยง: [java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory] ฉันได้สร้าง class net แล้ว - person B0r1; 21.03.2019
comment
@ B0r1 บางทีคุณอาจต้องเพิ่มการอ้างอิงบางอย่าง: เกิดจาก: java.lang.ClassNotFoundException: com.sun.xml.bind.v2.model.annotation.AnnotationReader - person Michał Ziober; 21.03.2019