有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

jaxb的javaxml解析问题

我是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数据


共 (1) 个答案

  1. # 1 楼答案

    在现金类,而不是 @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中实现的)

    ====

    使用JDK1.6.0@,我在Cash上的@XMLElement上运行了三种变体。没有财产。这导致了两次失败和一次成功。使用标准的JavaMaven项目。我的环境没有其他变化

    1@xmlement(name=“cash:no”,nillable=true)

    原始代码

    DefaultValidationEventHandler: [ERROR]: unexpected element (uri:"uri:cash", local:"no"). Expected elements are <{}cash:no>,<{}cash:phno>,<{}cash:name>,<{}cashage> 
    
    2@xmlement(name=“no”,nillable=true)
    DefaultValidationEventHandler: [ERROR]: unexpected element (uri:"uri:cash", local:"no"). Expected elements are <{}no>,<{}cash:phno>,<{}cash:name>,<{}cash:age> 
    
    3@xmlement(name=“no”,namespace=“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> 
    

    第三次跑步在前两次跑步时遇到了意想不到的因素,但这是现金。名称属性