使用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
相关产品推荐
相关产品推荐

