【问题标题】:Unable to get attribute value using JAXB ( For attribute in Parent class)无法使用 JAXB 获取属性值(对于父类中的属性)
【发布时间】:2016-11-22 00:54:42
【问题描述】:

我正在尝试使用 JAXB 读取一个 xml。

我面临一个奇怪的问题,即未读取父类的属性,但读取了子类的属性。 我参考了论坛,但这似乎是一个奇怪的论坛。

谁能告诉我我做错了什么。

XML。

<?xml version="1.0" encoding="UTF-8"?>
<PhoneDirectory>
<Exchange exchangeName="ashfield2133">Ashfield</Exchange>
<PhoneNumber id="23" number="0489524401">
<FirstName>Test</FirstName>
<LastName>Test</LastName>
<Address>#34,rt road, State,Country,22344 </Address>
</PhoneNumber>

<PhoneNumber id="88" number="0409545401">
<FirstName>Testf2</FirstName>
<LastName>Testl2</LastName>
<Address>St 2 , State,Country,34555</Address>
</PhoneNumber>


<PhoneNumber id="88" number="0446775401">
<FirstName>Testf3</FirstName>
<LastName>Testl3</LastName>
<Address>St 3 , State,Country,546777</Address>
</PhoneNumber>

</PhoneDirectory>

PhoneDirectory 类

package com.test.phoneDirectory.dataclass;

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.util.List;


@XmlRootElement(name="PhoneDirectory")
public class PhoneDirectory {

    private String exchange;
    private String exchangeName;

    @XmlElement(name="Exchange")
    public String getExchange() {
        return exchange;
    }

    public void setExchange(String exchange) {
        this.exchange = exchange;
    }

    @XmlAttribute(name="exchangeName")
    public String getExchangeName() {
        return exchangeName;
    }

    public void setExchangeName(String exchangename) {
        this.exchangeName = exchangename;
    }

    private List<PhoneNumber> phoneNumber;

    @XmlElement(name="PhoneNumber")
    public List<PhoneNumber> getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(List<PhoneNumber> phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

}

电话号码类

package com.test.phoneDirectory.dataclass;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="PhoneNumber")
public class PhoneNumber {

    private String id;
    private String number;

    private String firstName;
    private String lastName;
    private String address;

    @XmlAttribute(name="id")
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }

    @XmlAttribute(name="number")
    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    @XmlElement(name="FirstName")
    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    @XmlElement(name="LastName")
    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    @XmlElement(name="Address")
    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }


}

主类

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

import com.test.phoneDirectory.dataclass.PhoneDirectory;
import com.test.phoneDirectory.dataclass.PhoneNumber;


public class GetAllPhoneData {

    public static void main(String[] args) throws JAXBException {
        // TODO Auto-generated method stub
        JAXBContext jc = JAXBContext.newInstance(PhoneDirectory.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        PhoneDirectory phoneDirectory = (PhoneDirectory) unmarshaller.unmarshal(new File("src/config/PhoneDirectory.xml"));


        System.out.println("Get all phone details");
        System.out.println("Exchange:"+phoneDirectory.getExchange());
        System.out.println("exchangeName:"+phoneDirectory.getExchangeName());


      for (PhoneNumber phonedetails : phoneDirectory.getPhoneNumber()) {

          System.out.println(phonedetails.getId());
          System.out.println(phonedetails.getNumber());
          System.out.println(phonedetails.getFirstName());
          System.out.println(phonedetails.getLastName());
          System.out.println(phonedetails.getAddress());
    }

    }

}

输出

Get all phone details    
Exchange: Ashfield    
****Get exchangeName :null****    
23    
0489524401    
Test    
Test    
#34,rt road, State,Country,22344  

尽管提到字段的 XMLAttribute 注释,但您可以看到 exchangeName 为 null。

谢谢, 毗湿奴

【问题讨论】:

    标签: java xml jaxb


    【解决方案1】:

    您已在 PhoneDirectory 类中声明了 exchangeName 属性,但您的 XML 在 Exchange 元素中具有此属性。

    所以不是

    private String exchange;
    private String exchangeName;
    

    你需要一个像Exchange 这样的类和@XmlAttribute exchangeName@XmlValue exchange

    【讨论】:

    • 完美。非常感谢您指出。 :) 它现在可以工作了。
    猜你喜欢
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    相关资源
    最近更新 更多