You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用JAXB Unmarshall解析XML获取element标签属性报错如何解决

错误点定位

  • XML根节点映射错误:XML根元素是带xmi命名空间的xmi:XMI,你当前@XmlRootElement(name = "xmi")完全不匹配,同时未正确配置命名空间参数。
  • 层级映射缺失:XML的元素层级为XMI → xmi:Extension → elements → element,你跳过了Extension层直接映射elements,无法匹配节点路径。
  • 列表类型错误:Elements类中定义的List<Elements>类型错误,该节点下存储的是多个Element对象,应该声明为List<Element>。
  • 命名空间属性未配置:你要读取的idref、type都属于xmi命名空间(http://schema.omg.org/spec/XMI/2.1),仅写属性名无法匹配到xmi:idref、xmi:type属性。
  • 主类类型转换错误:你初始化JAXBContext传入的是Xmi.class,反序列化后却强转为elements类型,类型不匹配;同时Windows路径的反斜杠需要转义,C:\vinoth要写成C:\\vinoth。
  • 额外提示:你提供的XML中根节点<xmi:XMIxmi:version=存在笔误,标签名和属性之间缺少空格,需要修正为<xmi:XMI xmi:version=否则XML本身就是非法格式。

修正后代码

1. 根节点类 Xmi.java

@XmlRootElement(name = "XMI", namespace = "http://schema.omg.org/spec/XMI/2.1")
@XmlAccessorType(XmlAccessType.FIELD)
public class Xmi {
    @XmlElement(name = "Extension", namespace = "http://schema.omg.org/spec/XMI/2.1")
    private Extension extension;

    public Extension getExtension() {
        return extension;
    }

    public void setExtension(Extension extension) {
        this.extension = extension;
    }
}

2. 中间层 Extension.java

@XmlAccessorType(XmlAccessType.FIELD)
public class Extension {
    @XmlElement(name = "elements")
    private Elements elements;

    public Elements getElements() {
        return elements;
    }

    public void setElements(Elements elements) {
        this.elements = elements;
    }
}

3. Elements.java

@XmlAccessorType(XmlAccessType.FIELD)
public class Elements {
    @XmlElement(name = "element")
    private List<Element> elementList;

    public List<Element> getElementList() {
        return elementList;
    }

    public void setElementList(List<Element> elementList) {
        this.elementList = elementList;
    }

    @Override
    public String toString() {
        return "Elements [elementList=" + elementList + "]";
    }
}

4. Element.java

@XmlAccessorType(XmlAccessType.FIELD)
public class Element {
    @XmlAttribute(name = "idref", namespace = "http://schema.omg.org/spec/XMI/2.1")
    private String idref;
    @XmlAttribute(name = "type", namespace = "http://schema.omg.org/spec/XMI/2.1")
    private String type;
    @XmlAttribute(name = "name")
    private String name;
    @XmlAttribute(name = "scope")
    private String scope;

    public String getIdref() {
        return idref;
    }

    public void setIdref(String idref) {
        this.idref = idref;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getName() {
        return name;
    }

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

    public String getScope() {
        return scope;
    }

    public void setScope(String scope) {
        this.scope = scope;
    }

    @Override
    public String toString() {
        return "Element [idref=" + idref + ",type=" + type + ", name=" + name + ", scope=" + scope+ "]";
    }
}

5. 主类修正

public class XmlElement {
    public static void main(String[] args) {
        JAXBContext jaxbContext;
        // 路径反斜杠转义
        String fileLocation = "C:\\vinoth\\XML_JaxbParser\\elements.xml";
        try (FileInputStream fileInputStream = new FileInputStream(fileLocation)) {
            System.out.println("******** PARSING START ********");
            jaxbContext = JAXBContext.newInstance(Xmi.class);
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
            // 反序列化后类型为Xmi
            Xmi xmi = (Xmi) unmarshaller.unmarshal(fileInputStream);
            // 逐层获取elements列表
            Elements elements = xmi.getExtension().getElements();
            System.out.println(elements);
            System.out.println("******** PARSING DONE ********");
        } catch (Exception e) {
            System.out.println("******** ERROR: SOMETHING WENT WRONG ********");
            e.printStackTrace();
        }
    }
}

内容的提问来源于stack exchange,提问作者vinoth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 10:39:02