2016-02-23 2 views
1

В настоящее время я пытаюсь изменить много XML в объекты Java, но я все время застреваю. Я пробовал копировать множество разных примеров в Интернете, но я никогда не могу найти правильный путь, и мне очень сложно отлаживать его.Java - JAXB - Unmarshalling: Как достичь правильной настройки?

Мой XML выглядит следующим образом

<?xml version="1.0" encoding="utf-8"?> 
<XMLSOCCER.COM> 
    <TeamLeagueStanding xmlns="http://xmlsoccer.com/LeagueStanding"> 
    <Team>Leicester</Team> 
    <Team_Id>31</Team_Id> 
    <Played>26</Played> 
    <PlayedAtHome>12</PlayedAtHome> 
    <PlayedAway>14</PlayedAway> 
    <Won>15</Won> 
    <Draw>8</Draw> 
    <Lost>3</Lost> 
    <NumberOfShots>464</NumberOfShots> 
    <YellowCards>40</YellowCards> 
    <RedCards>1</RedCards> 
    <Goals_For>48</Goals_For> 
    <Goals_Against>29</Goals_Against> 
    <Goal_Difference>19</Goal_Difference> 
    <Points>53</Points> 
    </TeamLeagueStanding> 
    <TeamLeagueStanding xmlns="http://xmlsoccer.com/LeagueStanding"> 
    <Team>Tottenham</Team> 
    <Team_Id>21</Team_Id> 
... 

Так что я просто есть список TeamLeagueStanding с, что я хочу, чтобы сохранить в качестве объектов команды. Мой Java код для класса команды в настоящее время, как этот

@XmlRootElement(name = "TeamLeagueStanding") 
public class Team { 

    @XmlElement(name = "Team") 
    String teamName; 
    @XmlElement(name = "Team_Id") 
    int teamID; 

    public Team (String team, int id) { 
     super(); 
     this.teamName = team; 
     this.teamID = id; 
    } 

} 

Мои команды класса, который просто держать список команд, как это

@XmlRootElement(name = "XMLSOCCER.COM") 
public class Teams { 

    @XmlElement 
    List<Team> teamList; 

    public Teams() { 

    } 

} 

и моя главная функция как этот

public class Main { 

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

     File xml = new File("data/GetLeagueStandingsPrem1516.xml"); 
     JAXBContext jc = JAXBContext.newInstance(Teams.class); 
     Unmarshaller um = jc.createUnmarshaller(); 

     Teams t = (Teams) um.unmarshal(xml); 

     System.out.println(t.teamList.size()); 

    } 

} 

Я пробовал так много способов, и я всегда получаю исключение нулевого указателя или различные IllegalAnnotationExceptions. Если кто-нибудь знает, куда я иду, я бы очень признателен за любые указатели!

Спасибо,

Simon

+0

Рассмотрим указать XSD и генерировать классы JAXB с помощью XJC. (Обратите внимание: корневой элемент действителен только в корневом каталоге) – Puce

+0

Так что я думаю, что проблема связана с моим XML, а не с моей Java - я удалил атрибуты xmlns и код ниже. – doblo7

ответ

0

Я думаю, вы должны добавить @XmlAccessorType (XmlAccessType.FIELD) аннотацию

@XmlRootElement(name = "TeamLeagueStanding") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Team { 

    } 
0

Корневой элемент, кажется, XMLSOCCER.COM
1. создать XSD
2. Используя команду xjc, создайте классы java bean или вы можете использовать IDE для создания объектов.
3.keep создал объекты xml bean под src
4. затем вы передаете xml, чтобы быть незанятым
5. вы получите иерархически преобразованные объекты, к которым вы можете получить доступ.

+0

На самом деле я бы рекомендовал вызвать xjc через maven-jaxb2-plugin, который также по умолчанию генерирует классы JAXB под целевым объектом. Вы не должны проверять их в своем VCS. – Puce

0
  1. Добавить конструктор по умолчанию для класса Team

  2. Добавить

    @XmlElement(name = "TeamLeagueStanding") 
    List<Team> teamList; 
    

    к Teams класса;


Team.class:

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

@XmlRootElement(name = "TeamLeagueStanding") 
public class Team { 

    @XmlElement(name = "Team") 
    String teamName; 
    @XmlElement(name = "Team_Id") 
    int teamID; 

    public Team(){ 

    } 

    public Team (String team, int id) { 
     super(); 
     this.teamName = team; 
     this.teamID = id; 
    } 
} 

Teams.class

import javax.xml.bind.annotation.*; 
import java.util.List; 

@XmlRootElement(name = "XMLSOCCER.COM") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Teams { 

    @XmlElement(name = "TeamLeagueStanding") 
    List<Team> teamList; 

    public Teams() { 

    } 

} 
+0

@ doblo7 попробуйте этот код –

+0

Спасибо за ответ. Я пробовал это, и я получаю NullPointerEx в teamList – doblo7