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

JAXB解组中的空值

谭炎彬
2023-03-14

嗨,我想使用maven依赖项使用un-marshaling来获取嵌套xml的值,但最终的输出是返回给我空值。我使用了maven项目中的3个包和vehicle.xml包含了car的值,在获取这些值后,我必须将它们插入到access数据库中

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

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



    }

}
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时获得这些值

共有1个答案

轩辕涵亮
2023-03-14

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;
 类似资料:
  • 在不使用getter和setter的情况下,JAXB可以正确地解组所提供的JSON。 null和“null”是完全不同的东西,但是我不想在POJO中包含这个字段,并且我必须忽略这些null值。 编辑

  • 当在testng单元testcase中运行时,JAXB将XML文件解组到对象中工作正常。 当相同的代码被用来在另一个进程中解封相同的XML文件时,我得到了一个空对象。我可以验证对象是为XML文档中的每个元素创建的,并且所有适配器都被调用。在unmarshaller中设置事件处理程序,但没有验证问题。当我设置xmlns属性和前缀时,即使返回空对象,行为也略有不同。 我看了好几篇文章,但都无法与我面临

  • 问题内容: 这是我的xml,需要将其转换为Java。我用过jaxb 并引发以下异常javax.xml.bind.UnmarshalException:意外元素(uri:“ http://www.ae.com/Event/Load ”,本地:“ Order”)。期望的元素是<{} lm:Order> 这是我的解组代码 订购Pojo班 您能否也帮助我阅读,当前正在读取文件,需要读取为XML Strin

  • 我有一个为安全令牌构建的XML。这些包含基于WS-Trust的名称空间,但是当我解组这个XML以创建< code > RequestSecurityTokenResponseCollection 对象时,它用< code>ns1 、< code>ns2 、< code>ns3等名称空间替换了这些名称空间。 是否有一种方法可以在不更改输入XML中的名称空间和名称空间前缀的情况下解组XML? 这是我一

  • 大家好,我怎样才能在XML中解组对象列表。我的XML将是这样的 我想在最后得到一个对象列表。

  • 我有一个简单的xml要解组。但是我在输出中只得到一个空列表。不会引发任何异常。这是一个第三方生成的xml,我需要使这一工作没有任何变化的xml。 XML: 用于动物的POJO豆: 猫咪的POJO豆 非马歇尔代码是: 最后一行给出了空指针异常。 我是否对 BEAN 类中的命名空间执行了操作?我是Jaxb的新手,这个问题现在困扰了我3天!我之前问过这个问题,但无法得到正确的答案,这是一个更准确的问题。