java - JAXB 解码中的 NULL 值

标签 java jaxb unmarshalling

嗨,我想使用 maven 依赖项的解编码获取嵌套 xml 的值,但最终输出返回空值。我在 maven 项目和 vehicle.xml 中使用了 3 个包在获取值后包含汽车的值,我必须将它们插入访问数据库

我的 XML 文件 ---> Vehicle.xml

<?xml version="1.0" encoding="UTF-8"?>
<Vehicle>
   <Car>
      <manufacturer>Maruti</manufacturer>
      <cost>675000</cost>
      <name>Ciaz</name>
      <fueType>Petrol</fueType>
      <driverTye>Manual</driverTye>
   </Car>
   <Car>
      <manufacturer>Maruti</manufacturer>
      <cost>575000</cost>
      <name>Dezire</name>
      <fueType>Petrol</fueType>
      <driverTye>Manual</driverTye>
   </Car>
</Vehicle>

POJO 类

车辆.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;
    }

    /*
     * public Vehicle(List<Car> car) { super(); this.car = car; }
     */

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

}

Car.java(这是子 POJO)

package jaxb;

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 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 +"]";
        }

车辆Jxb.java

这个文件包含我们解码方法的实现

package jaxb;

import java.io.File;

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) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }  



    }

}

应用程序.java

package com.project.XMLDB;
import jaxb.*;
public class App 
{
    public static void main( String[] args ) 
    {
        VehicleJxb obj= new VehicleJxb();
       obj.unmarhalling();
    }
}

我的输出来了

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.sun.xml.bind.v2.runtime.reflect.opt.Injector (file:/C:/Users/Shivam%20Sharma/.m2/repository/com/sun/xml/bind/jaxb-impl/2.2.11/jaxb-impl-2.2.11.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int)
WARNING: Please consider reporting this to the maintainers of com.sun.xml.bind.v2.runtime.reflect.opt.Injector
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Vehicle[ Car=null]

我想获取值,因为最终输出返回 null

最佳答案

Unmarshaller 区分大小写。在您的 pojo 中,您有变量名称 car,但在 XML 中您有 Car。将其更改为以下内容即可。

<?xml version="1.0" encoding="UTF-8"?>
<Vehicle>
   <car>
      <manufacturer>Maruti</manufacturer>
      <cost>675000</cost>
      <name>Ciaz</name>
      <fueType>Petrol</fueType>
      <driverTye>Manual</driverTye>
   </car>
   <car>
      <manufacturer>Maruti</manufacturer>
      <cost>575000</cost>
      <name>Dezire</name>
      <fueType>Petrol</fueType>
      <driverTye>Manual</driverTye>
   </car>
</Vehicle>

或者您需要明确提及。

@XmlElement(name = "Car")
private List<Car> car;

关于java - JAXB 解码中的 NULL 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58086980/

相关文章:

Java:匿名类作为现有接口(interface)的子类?

java - 如何在 JAXB 中生成 xml 时为空值生成 xml 单个空标记

android - 使用 Android 的 Parcel 编码和解码 List<List<T>>

javax.xml.bind.UnmarshalException : XML document structures must start and end within the same entity

java - 为什么 Double.parseDouble(null) 和 Integer.parseInt(null) 会抛出不同的异常?

Java创建多个数组列表

java - 如何在不映射根 xml 元素的情况下解码 xml?

java - 无法将(带有命名空间的 XML)输入流解码到对象中

java - 是否可以使用 JAXB 根​​据某些属性值获取 XML 元素?

java - 使用 JAXB 继承