繁体   English   中英

XML 属性解组的 Null 值

[英]Null values for XML attribute unmarshaling

这是我的 xml 文件,它在解组时返回 null 的类型货币值,以及 rest 打印所有值。 我在这里使用了 unmarshalling 并指定了所有 Parent 和 Child POOJ,最后我的 Main 方法调用 unmarshall function
1) 车辆.xml

<?xml version="1.0" encoding="UTF-8"?>
<Vehicle>
   <car>
      <manufacturer>Maruti</manufacturer>
      <cost currency="INR">675000</cost>
      <name type="sedan">Ciaz</name>
      <fuelType>Petrol</fuelType>
      <driverType>Manual</driverType>
   </car>
   <car>
      <manufacturer>Maruti</manufacturer>
      <cost currency="INR">575000</cost>
      <name type="sedan">Dezire</name>
      <fuelType>Petrol</fuelType>
      <driverType>Manual</driverType>
   </car>
</Vehicle>

相应文件如 2) Vehicle.java

package jaxb;

import java.util.List;

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

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

    @XmlElement
    private List<Car> car;

    public List<Car> getCar() {
        return car;
    }

    @Override
    public String toString() {
        return "Vehicle[ Car=" + car + "]";
    }

}

3) POJO Car.java

package jaxb;

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

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

    private String manufacturer;
    private String name;
    private String driverType;
    private String fuelType;
    private String currency;


    @XmlAttribute
    public String getCurrency() {
        return currency;
    }
    public void setCurrency(String currency) {
        this.currency = currency;
    }

    @XmlAttribute
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }


    private String type;

    private int cost;

    @XmlElement
    public String getManufacturer() {
        return manufacturer;
    }
    public void setManufacturer(String manufacturer) {
        this.manufacturer = manufacturer;
    }

    @XmlElement
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    @XmlElement
    public String getDriverType() {
        return driverType;
    }
    public void setDriverType(String driverType) {
        this.driverType = driverType;
    }

    @XmlElement
    public String getFuelType() {
        return fuelType;
    }
    public void setFuelType(String fuelType) {
        this.fuelType = fuelType;
    }

    @XmlElement
    public int getCost() {
        return cost;
    }
    public void setCost(int cost) {
        this.cost = cost;
    }


     @Override
        public String toString() {
            return "Car [name=" + name + ", fuelType=" + fuelType + ", cost=" + cost+",driverType="+driverType +",currency="+currency+ " , type="+type +"]";
        }


}

4) Fie 用于解组

package jaxb;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

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

public class VehicleJxb {

    public void unmarhalling() {

        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(Vehicle.class);

            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

            Vehicle vehicle = (Vehicle) jaxbUnmarshaller.unmarshal(new File("src\\main\\java\\Data\\Vehicle.xml"));

            System.out.println(vehicle);

        } catch (JAXBException e) {

            e.printStackTrace();
        }

    }

}

5) 最终 Output

Vehicle[ Car=[Car [name=Ciaz, fuelType=Petrol, cost=675000,driverType=Manual,currency=null , type=null], Car [name=Dezire, fuelType=Petrol, cost=575000,driverType=Manual,currency=null , type=null]]]

使用 JAXB 您只能在同一级别上使用 map 属性。 对于嵌入元素的 map 属性,您应该为这些元素使用单独的类。

以下是 map 属性的方法(为简单起见,使用 public 属性):

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

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

    public static class Cost {

        @XmlValue
        public String value;

        @XmlAttribute
        public String currency;

        @Override
        public String toString() {
            return "Cost[value=" + value + ", currency=" + currency + "]";
        }

    }

    public static class Name {

        @XmlValue
        public String value;

        @XmlAttribute
        public String type;

        @Override
        public String toString() {
            return "Name[value=" + value + ", type=" + type + "]";
        }

    }

    private String manufacturer;
    private Name name;
    private String driverType;
    private String fuelType;

    @XmlAttribute
    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    private String type;

    private Cost cost;

    @XmlElement
    public String getManufacturer() {
        return manufacturer;
    }

    public void setManufacturer(String manufacturer) {
        this.manufacturer = manufacturer;
    }

    @XmlElement
    public Name getName() {
        return name;
    }

    public void setName(Name name) {
        this.name = name;
    }

    @XmlElement
    public String getDriverType() {
        return driverType;
    }

    public void setDriverType(String driverType) {
        this.driverType = driverType;
    }

    @XmlElement
    public String getFuelType() {
        return fuelType;
    }

    public void setFuelType(String fuelType) {
        this.fuelType = fuelType;
    }

    @XmlElement
    public Cost getCost() {
        return cost;
    }

    public void setCost(Cost cost) {
        this.cost = cost;
    }

    @Override
    public String toString() {
        return "Car [name=" + name + ", fuelType=" + fuelType + ", cost=" + cost + ",driverType=" + driverType + "]";
    }

}

一种常见的方法是添加一个额外的 class 来处理属性 + 值。 如果您在使用Car时不想要额外的间接性。 您可以为其添加快捷方式获取器。

public class Car {
    // .....

    private Money cost;

    public Money getCost() {
        return cost;
    }

    public void setCost(Money cost) {
        this.cost = cost;
    }
    /* Optional shortcut getter */
   public String getCurrency(){
     if(getCost()==null){
        return null;
     }
     return getCost().getCurrency();
   }
}

public static class Money {
    private String currency;
    private int amount;

    @XmlAttribute
    public String getCurrency() {
        return currency;
    }

    public void setCurrency(String currency) {
        this.currency = currency;
    }

    @XmlValue
    public int getAmount() {
        return amount;
    }

    public void setAmount(int cost) {
        this.amount = cost;
    }
}

尝试这个:

@XmlAttribute(name = "cost currency")
public String getCurrency() {
    return currency;
}
@XmlAttribute(name = "name type")
public String getType() {
    return type;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM