当前位置: 首页 > 知识库问答 >
问题:

无法使用JAXB获取属性值(对于父类中的属性)

颜森
2023-03-14

我正在尝试使用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>

电话目录类

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  

如您所见,尽管提到了字段的XMLAt⃣注释,但exchange eName为null。

谢谢,毗湿奴

共有1个答案

秦楚
2023-03-14

您已经在PhoneDirectory类中声明了exchangeNameattribute,但您的XML在 Exchange

所以不要

private String exchange;
private String exchangeName;

您将需要一个类似于< code>Exchange的类,带有< code > @ XML attribute < code > Exchange name 和< code > @ XML value < code > Exchange 。

 类似资料:
  • 我向一个服务发出API请求,该服务在主体中返回一个JSON对象。 我似乎无法在groovy中获得名为“properties”的键的值。 每次我调用我得到以下内容 但是如果我只调用,就会得到预期的JSON对象 同样,如果I我得到这只是当我我是否得到上述响应

  • Beans文件: 在BaseTest中,当调用)方法时,属性文件中的值起作用,但如果试图将该值用作中的变量,则该值为空。你能帮帮我吗?

  • 这是我的xml: 我为这个xml使用了JAXB和unMarshall,我可以得到描述和外部密钥。但是我不能得到有价值的属性名称。 > 这是我的java类: 组织JAVA 银行JAVA 如何获取属性名称和值?谢谢你

  • 这是我的建筑。格雷德尔 因此,restTemplate抛出NullPointerException而不是返回模拟obj。

  • 检索给定节点resp的所有属性名(而不是属性值!)的Xpath表达式看起来如何。xml标签? 假设以下XML文档: Xpath//title/@*会选择“eng,fr,easyreading”,但哪个Xpath会选择“lang,lang,type”?

  • 问题内容: 我正在使用Android从Web解析XML。下面的代码显示了XML的示例。我遇到的问题是我无法获得item标签的字符串值。当我使用它时,它输出的是名称,而不是属性的值。 问题答案: 用 代替 因为正如文档所说: getQName : 返回属性的限定名称(前缀)。 getValue : 通过限定(前缀)名称查找属性的值。 请参阅此示例以获取属性名称和值