Dificuldade em transformar lista de XML em ArrayList

Bom dia, pessoal!

Estou tentando pegar um XML de um site e transformá-lo em um objeto, porém não consigo executar tal função. Quando utilizei praticamente o mesmo código para apenas um XML que continha apenas um exemplo de “Carro” eu consegui carregar o objeto, entretanto com a lista de objetos não consigo, vocês poderiam me dar uma força?

Segue a classe principal:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;

public class Teste {

  private final String USER_AGENT = "Mozilla/5.0";

  public static void main(String[] args) throws Exception {

    Teste http = new Teste();

    System.out.println("Testing 1 - Send Http GET request");
    http.sendGet();

//      System.out.println("\nTesting 2 - Send Http POST request");
//      http.sendPost();
  }

  // HTTP GET request
  private void sendGet() throws Exception {

    String url = "http://www.teste.com/cars.xml";

    URL obj = new URL(url);
    HttpURLConnection con = (HttpURLConnection) obj.openConnection();

    // optional default is GET
    con.setRequestMethod("GET");

    //add request header
    con.setRequestProperty("User-Agent", USER_AGENT);

    int responseCode = con.getResponseCode();
    System.out.println("\nSending 'GET' request to URL : " + url);
    System.out.println("Response Code : " + responseCode);

    BufferedReader in = new BufferedReader(
            new InputStreamReader(con.getInputStream()));

    try {
      
     // String message = org.apache.commons.io.IOUtils.toString(in);
      //Transforma xml em objeto
      JAXBContext aXBContext = JAXBContext.newInstance(Cars.class);
      Unmarshaller cu = aXBContext.createUnmarshaller();
      
      Cars cars = (Cars) cu.unmarshal(in);
      System.out.println(cars);

      if(cars != null){
        System.out.println("Não é nulo!");
      }

    } catch (Exception e) {
      System.out.println(e.getMessage());
    }

  }
}

A classe Car:

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

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

  private String manufacturerCar;
  private String modelCar;
  private String doorsCar;
  private String gearshift;

  public Car() {  }

  public String getManufacturerCar() {
return manufacturerCar;
  }

  @XmlElement
  public void setManufacturerCar(String manufacturerCar) {
this.manufacturerCar = manufacturerCar;
  }

  public String getModelCar() {
return modelCar;
  }

  @XmlElement
  public void setModelCar(String modelCar) {
this.modelCar = modelCar;
  }

  public String getDoorsCar() {
return doorsCar;
  }

  @XmlElement
  public void setDoorsCar(String doorsCar) {
this.doorsCar = doorsCar;
  }

  public String getGearshift() {
return gearshift;
  }

  @XmlElement
  public void setGearshift(String gearshift) {
this.gearshift = gearshift;
  }

  @Override
  public String toString() {
return "Car{" + "manufacturerCar=" + manufacturerCar + ", modelCar=" + modelCar + ", doorsCar=" + doorsCar + ", gearshift=" + gearshift + '}';
  }
}

A classe Cars:

import java.util.ArrayList;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement (name = "Cars")

public class Cars {
  
  private ArrayList<Car> cars = new ArrayList<>();

  public ArrayList<Car> getCars() {
    return cars;
  }
  
  @XmlElement
  public void setCars(ArrayList<Car> cars) {
    this.cars = cars;
  }

  public Cars() {}
    
}

e o XML:

<Cars>
<Car>
<manufacturerCar>VW</manufacturerCar>
<modelCar>FUSCA</modelCar>
<doorsCar>2</doorsCar>
<gearshift>MANUAL</gearshift>
</Car>
<Car>
<manufacturerCar>FORD</manufacturerCar>
<modelCar>FOCUS</modelCar>
<doorsCar>4</doorsCar>
<gearshift>AUTOMATICO</gearshift>
</Car>
<Car>
<manufacturerCar>FIAT</manufacturerCar>
<modelCar>UNO</modelCar>
<doorsCar>4</doorsCar>
<gearshift>MANUAL</gearshift>
</Car>
<Car>
<manufacturerCar>VW</manufacturerCar>
<modelCar>UP!</modelCar>
<doorsCar>4</doorsCar>
<gearshift>AUTOMATICO</gearshift>
</Car>
<Car>
<manufacturerCar>PORSHE</manufacturerCar>
<modelCar>Q100</modelCar>
<doorsCar>2</doorsCar>
<gearshift>AUTOMATICO</gearshift>
</Car>
<Car>
<manufacturerCar>RENAULT</manufacturerCar>
<modelCar>DUSTER</modelCar>
<doorsCar>4</doorsCar>
<gearshift>Manual</gearshift>
</Car>
<Car>
<manufacturerCar>HONDA</manufacturerCar>
<modelCar>CIVIC</modelCar>
<doorsCar>4</doorsCar>
<gearshift>Manual</gearshift>
</Car>
<Car>
<manufacturerCar>MITSUBISHI</manufacturerCar>
<modelCar>PAJERO</modelCar>
<doorsCar>4</doorsCar>
<gearshift>Manual</gearshift>
</Car>
</Cars>

Tenho a sensação de que estou errando nas classes em alguma tag, porém não tenho certeza.

Colega

Coloque na classe Cars o nome de cada elemento na lista cars assim:

@XmlElement(name="Car")
public void setCars(ArrayList<Car> cars) {
	this.cars = cars;
}
1 curtida

Cara, muito, mas MUITO obrigado mesmo. Tentei inúmeras tags, entretanto nenhuma funcionou, simplesmente com isso foi!

Então quando eu criar uma lista acima dela devo sempre colocar os elementos que a compõe?

Sabe onde eu posso procurar detalhadamente por JAXB?

de qualquer forma muito obrigado.

Assim no xml cada elemento da lista tem o nome de Car assim p/ que ele identifique cada um vc deve especificar esse nome.

Há alguns anos trabalhei com JAXB e tive muita dificuldade, então pesquisei bastante inclusive na documentação oficial do Java EE…

Um ebook em português que tem uma boa explicação sobre isso (apesar de não ser tão extenso) é o do Alessandre Saudate https://www.casadocodigo.com.br/products/livro-soa-webservices que tem um capítulo de JAXB.

[]´s

Luiz Renato

Esse e-book parece ser perfeito para o que eu preciso! Muito obrigado novamente ^^