Dificuldade em transformar lista de XML em ArrayList

4 respostas Resolvido
java
F

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.

4 Respostas

L
Solucao aceita

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;
}
F

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.

L

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

F

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

Criado 29 de setembro de 2017
Ultima resposta 30 de set. de 2017
Respostas 4
Participantes 2