【问题标题】:XML parsing issue with jaxbjaxb 的 XML 解析问题
【发布时间】:2016-04-11 00:28:10
【问题描述】:

我是 jaxb 的新手,需要一些帮助。

我在尝试执行以下代码时得到空值。请有人指导我如何实现预期的输出。

我正在尝试解组的实际 XMl:

<?xml version="1.0" encoding="UTF-8"?>
    <customer >
    <cash xmlns:cash="uri:cash" >   
        <cash:no>10</cash:no>
        <cash:name>naveen</cash:name>
        <cash:age>27</cash:age>
        <cash:phno>9176927613</cash:phno>   
    </cash>
</customer>

我正在使用的映射类:

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;

@XmlRootElement(name="cash")
public class Cash {
    private int no;
    private String name;
    private int age;
    private Long phno;
    public int getNo() {
        return no;
    }
    @XmlElement(name="cash:no",nillable=true)
    public void setNo(int no) {
        this.no = no;
    }
    public String getName() {
        return name;
    }
    @XmlElement(name="cash:name",nillable=true)
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    @XmlElement(name="cash:age",nillable=true)
    public void setAge(int age) {
        this.age = age;
    }
    public Long getPhno() {
        return phno;
    }
    @XmlElement(name="cash:phno",nillable=true)
    public void setPhno(Long phno) {
        this.phno = phno;
    }
    @Override
    public String toString() {
        return "Cash [no=" + no + ", name=" + name + ", age=" + age + ", phno="
                + phno + "]";
    }
}

客户 DTO:

import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="customer")

public class Customer {

    private List<Cash> cash;

    public List<Cash> getCash() {
        return cash;
    }
    @XmlElement(name="cash")
    public void setCash(List<Cash> cash) {
        this.cash = cash;
    }

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

编组块:

File  file = new File("cust.xml");  

JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);

Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();  

Customer que= (Customer) jaxbUnmarshaller.unmarshal(file);

System.out.println(que);     

实际输出:Customer [cash=[Cash [no=0, name=null, age=0, phno=null]]]

预期的输出是实际的 XML 数据。

【问题讨论】:

标签: java xml jaxb jaxb2


【解决方案1】:

在 Cash 类上,而不是 @XmlElement(name="cash:no",nillable=true)

尝试从名称值中删除cash:@XmlElement(name="no",nillable=true)

这产生了:Customer [cash=[Cash [no=10, name=naveen, age=27, phno=9176927613]]]

另一种选择是将命名空间添加到注解中:

@XmlElement ( name = "no", namespace = "uri:cash" , nillable = true )

要获得更多信息,请将DefaultValidationEventHandler 添加到解组器:

jaxbUnmarshaller.setEventHandler(new javax.xml.bind.helpers.DefaultValidationEventHandler());

这将输出:

javax.xml.bind.UnmarshalException: unexpected element (uri:"uri:cash", local:"no"). Expected elements are <{uri:cash}phno>,<{uri:cash}age>,<{uri:cash}name>,<{}cash:no>
DefaultValidationEventHandler: [ERROR]: unexpected element (uri:"uri:cash", local:"no"). Expected elements are <{uri:cash}phno>,<{uri:cash}age>,<{uri:cash}name>,<{}cash:no> 

根据@XMLElement 注释,{}cash:no 是预期的,但 xml 解析出一个本地名称 no 而不是 cash:no

(在 JDK 8 中执行此操作)

====

使用 JDK 1.6.0_65,我在 Cash.no 属性的 @XMLElement 上运行了三个变体。这产生了两次失败和一次成功。使用标准的 Java Maven 项目。我的环境没有其他变化。

1 @XmlElement ( 名称 = "cash:no", nillable = true )

原始代码。

DefaultValidationEventHandler: [ERROR]: unexpected element (uri:"uri:cash", local:"no"). Expected elements are <{}cash:no>,<{}cash:phno>,<{}cash:name>,<{}cashage> 
2 @XmlElement(名称=“否”,nillable = true)
DefaultValidationEventHandler: [ERROR]: unexpected element (uri:"uri:cash", local:"no"). Expected elements are <{}no>,<{}cash:phno>,<{}cash:name>,<{}cash:age> 
3 @XmlElement(名称=“否”,命名空间=“uri:cash”,nillable = true)
DefaultValidationEventHandler: [ERROR]: unexpected element (uri:"uri:cash", local:"name"). Expected elements are <{}cash:phno>,<{}cash:name>,<{uri:cash}no>,<{}cash:age> 

运行 3 在前两次运行中遇到了意外元素,但它位于 Cash.name 属性上。

【讨论】:

  • 感谢您的建议,但您的方法无效。顺便说一句,我们正在开发 jdk 6。
  • 运行 DefaultValidationEventHandler 在控制台输出中产生了什么?
  • 嗨,naveenR,您找到答案了吗?只是想知道最终的解决方案是什么。谢谢
猜你喜欢
  • 2011-08-11
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
  • 1970-01-01
  • 2016-05-29
  • 2012-12-25
相关资源
最近更新 更多