当前位置: 首页 > 知识库问答 >
问题:

XMLDecoder>>java.lang.IllegalArgumentException:不支持的元素

吕天逸
2023-03-14
<?xml version="1.0" encoding="UTF-8"?>
    <net>
       <node label="A">
        ...
       </node>
       <node label="B">
        ...
       </node>
       <node label="C">
        ...
       </node>
    </net>
    ...
    FileInputStream file = new FileInputStream("example.xml");
    XMLDecoder decoder = new XMLDecoder(file);
    Object decodedResistors = (Object) decoder.readObject();
    file.close();
    ...

共有1个答案

曾新
2023-03-14

不要将java.beans.xmlDecoder用于反序列化自定义XML有效负载。它不是为这个设计的。阅读文章JavaBeans组件的长期持久性:XML模式。它包含一些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,请使用JAXBJackson XML。您需要创建一个具有JAXB注释的POJO模型:

@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'}]}
    null
 类似资料:
  • 我正在尝试‘获取’一个rss提要。 当我检查“res”里面是什么的时候。它似乎得到了整个XML。但后来,我试图解码它,我得到:

  • 当我构建我的应用程序时,我得到了以下错误。任何帮助都将不胜感激。 根:生成。格拉德尔 settings.gradle 应用程序:生成。格拉德尔 失败:生成失败,出现异常*其中:设置文件“/Users/Documents/android/MyApplication5/Settings。gradle“*出了什么问题:无法编译设置文件”//Users/anand/Documents/android/My

  • 我正在尝试为我的项目使用插件,但在运行命令时得到错误。谁能帮助解决这个问题。提前道谢。 我的Build.sbt 名称:=“包装” 版本:=“1.0” enablePlugins(JDKPackagerPlugin) 我的主要班级 我的plugins.sbt

  • 本文向大家介绍有哪些标签是不支持伪元素的?相关面试题,主要包含被问及有哪些标签是不支持伪元素的?时的应答技巧和注意事项,需要的朋友参考一下 首先我们要知道伪元素有哪些: ::after ::before ::first-letter ::fist-line (单双冒号皆可) ::selection ::backdrop (仅双冒号) 伪元素虽然强大,但是还是有一些特定的标签是不支持伪元素 befo

  • 我需要在JAX-WS中通过客户端连接到外部服务器。客户端在Wildfly 8上运行。使用Java8连接是正常的。但我在Java7中连接到服务器时遇到了问题(我尝试了u45、67、79)。服务器端安全性的属性为https://www.ssllabs.com/ssltest/analyze.html?d=app.bundesnetzagentur.de 在部分“密码套件”中有四个密码。源代码不应支持J

  • 26.2. Spring的元数据支持 为了与Spring提供的其他重要概念的抽象相一致,Spring提供了一个对元数据实现的门面(facade), 以org.springframework.metadata.Attributes接口的形式来实现。 这个门面因以下几个原因而显得很有价值: 尽管Java 5提供了语言级的元数据支持,但提供这样一个抽象还是能带来价值: Java 5的元数据是静态的。它是