2016-03-07 122 views
0

阅读我创建的以下XML文件时出现问题。无法使用JAXB读取XML文件?

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<prsettings> 
<prsetting> 
    <players> 
     <player> 
      <lastDateEntered>0</lastDateEntered> 
      <lastTournament>1</lastTournament> 
      <playerId>0</playerId> 
      <playersStatus>unrated</playersStatus> 
      <playersTag>asfd</playersTag> 
      <score>5.0</score> 
      <setsPlayed>0</setsPlayed> 
      <tourneysWhileInactive>0</tourneysWhileInactive> 
     </player> 
     <player> 
      <lastDateEntered>0</lastDateEntered> 
      <lastTournament>1</lastTournament> 
      <playerId>1</playerId> 
      <playersStatus>unrated</playersStatus> 
      <playersTag>ba</playersTag> 
      <score>5.0</score> 
      <setsPlayed>0</setsPlayed> 
      <tourneysWhileInactive>0</tourneysWhileInactive> 
     </player> 
     <player> 
      <lastDateEntered>0</lastDateEntered> 
      <lastTournament>1</lastTournament> 
      <playerId>2</playerId> 
      <playersStatus>unrated</playersStatus> 
      <playersTag>asdgf</playersTag> 
      <score>5.0</score> 
      <setsPlayed>0</setsPlayed> 
      <tourneysWhileInactive>0</tourneysWhileInactive> 
     </player> 
    </players> 
    <challongeApiKey>asbg</challongeApiKey> 
    <challongeUsername>asf</challongeUsername> 
    <implementPointDecay>false</implementPointDecay> 
    <numSetsNeeded>5</numSetsNeeded> 
    <numTourneysForActive>2</numTourneysForActive> 
    <numTourneysForInnactive>5</numTourneysForInnactive> 
    <numTourneysNeeded>5</numTourneysNeeded> 
    <pointsRemoved>5</pointsRemoved> 
    <prName>asf</prName> 
    <removeInnactive>false</removeInnactive> 
    <showPlacingDiff>false</showPlacingDiff> 
    <showPointDiff>false</showPointDiff> 
    <startOfDecay>3</startOfDecay> 
</prsetting> 

我PRSetting对象的observableList和PRSetting对象中我有运动员的ArrayList。这就是为什么我创建了一个POJO文件,并且在PRSetting对象中,我设置的唯一对象是以下内容。

@XmlElementWrapper(name="players") 
@XmlElement(name ="player") 
private ArrayList<PlayerProfile> playersList = new ArrayList<PlayerProfile>(); 

这也是我的POJO文件,应该是用来写和读的XML文件。

@XmlRootElement (name = "prsettings") 
public class PRSettingsWrapper { 
private ObservableList<PRSettings> prList; 

@XmlElement(name = "prsetting") 
public ObservableList<PRSettings> getPrList(){ 
    return prList; 
} 

public void setPrList(ObservableList<PRSettings> prList){ 
    this.prList = prList; 
} 
} 

出于某种原因,每当我试图用下面的代码

 JAXBContext context = JAXBContext 
       .newInstance(PRSettingsWrapper.class); 
     Unmarshaller um = context.createUnmarshaller(); 

     // Reading XML from the file and unmarshalling. 
     PRSettingsData wrapper = (PRSettingsData) um.unmarshal(file); 

     prList.clear(); 
     prList.addAll(wrapper.getPrList()); 

     // Save the file path to the registry. 
     setPrSettingsFilePath(file); 

我似乎无法到XML文件成功加载到对象加载数据。文件路径工作正常,但我不知道我做错了什么。

非常感谢您的帮助。

回答

0

抱歉误导你的原因。

该问题是由ObservableList引起的;

你可以参考这篇文章: Marshalling ObservableList with JAXB

我修改后的代码从上面的链接,以及以下应该是可行的。

anotherTest.MyContainer

package anotherTest; 

import java.util.List; 

    import javafx.collections.FXCollections; 
    import javafx.collections.ObservableList; 

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

    @XmlRootElement(name = "prsettings") 
    public class MyContainer extends MyObject { 

     private ObservableList<MyObject> children = FXCollections.observableArrayList(); 

     @XmlElements({ @XmlElement(name = "prsetting", type = MyObject.class) }) 
     public List<MyObject> getChildren() { 
      return children; 
     } 

     public String toString() { 

      StringBuilder sb = new StringBuilder(); 
      sb.append("children:"); 

      for (MyObject node : children) { 
       sb.append("\n"); 
       sb.append(" " + node.toString()); 
      } 
      return sb.toString(); 

     } 
    } 

anotherTest.MyObject

package anotherTest; 

    import java.util.List; 

    import javax.xml.bind.annotation.XmlElement; 
    import javax.xml.bind.annotation.XmlElementWrapper; 
    import javax.xml.bind.annotation.XmlType; 

    @XmlType(name = "Object") 
    public class MyObject { 

     private String challongeApiKey; 

     @XmlElementWrapper(name = "players") 
     private List<PlayerProfile> player; 

     public String getChallongeApiKey() { 
      return challongeApiKey; 
     } 

     public void setChallongeApiKey(String challongeApiKey) { 
      this.challongeApiKey = challongeApiKey; 
     } 

     public List<PlayerProfile> getPlayer() { 
      return player; 
     } 

     public void setPlayers(List<PlayerProfile> player) { 
      this.player = player; 
     } 

    } 

anotherTest.PlayerProfile

package anotherTest; 

public class PlayerProfile { 

    private int playerId; 
    private String playersStatus; 

    public int getPlayerId() { 
     return playerId; 
    } 

    public void setPlayerId(int playerId) { 
     this.playerId = playerId; 
    } 

    public String getPlayersStatus() { 
     return playersStatus; 
    } 

    public void setPlayersStatus(String playersStatus) { 
     this.playersStatus = playersStatus; 
    } 

} 

anotherTest.Example

package anotherTest; 

import java.io.StringReader; 
import java.io.StringWriter; 
import java.util.ArrayList; 
import java.util.List; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Marshaller; 
import javax.xml.bind.Unmarshaller; 

public class Example { 
    public static void main(String[] args) { 

     // create container with list 
     MyContainer container = new MyContainer(); 

     // add objects 
     MyObject object; 

     object = new MyObject(); 
     object.setChallongeApiKey("ABCABC"); 
     container.getChildren().add(object); 

     PlayerProfile p = new PlayerProfile(); 
     p.setPlayerId(1); 
     p.setPlayersStatus("unrated"); 

     List<PlayerProfile> l = new ArrayList<>(); 
     l.add(0, p); 

     object.setPlayers(l); 

     // marshal 
     String baseXml = marshal(container); 

     // unmarshal 
     container = unmarshal(baseXml); 

     System.out.println("unmarshal test: " + container.getChildren().get(0).getChallongeApiKey()); 
     System.out.println("unmarshal test: " + container.getChildren().get(0).getPlayer().get(0).getPlayerId()); 
     System.out.println("unmarshal test: " + container.getChildren().get(0).getPlayer().get(0).getPlayersStatus()); 

     System.exit(0); 
    } 

    public static String marshal(MyContainer base) { 

     try { 

      JAXBContext jaxbContext = JAXBContext.newInstance(MyContainer.class); 

      Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 
      jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 

      StringWriter stringWriter = new StringWriter(); 
      jaxbMarshaller.marshal(base, stringWriter); 
      String xml = stringWriter.toString(); 

      System.out.println("XML:\n" + xml); 

      return xml; 

     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 

    } 

    public static MyContainer unmarshal(String xml) { 

     try { 

      JAXBContext jaxbContext = JAXBContext.newInstance(MyContainer.class); 

      Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
      StringReader stringReader = new StringReader(xml); 

      MyContainer container = (MyContainer) jaxbUnmarshaller.unmarshal(stringReader); 

      return container; 

     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 

    } 
} 

在控制台输出

XML: 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<prsettings> 
    <prsetting> 
     <players> 
      <player> 
       <playerId>1</playerId> 
       <playersStatus>unrated</playersStatus> 
      </player> 
     </players> 
     <challongeApiKey>ABCABC</challongeApiKey> 
    </prsetting> 
</prsettings> 

unmarshal test: ABCABC 
unmarshal test: 1 
unmarshal test: unrated 

对不起,我不知道为什么无论是。我测试了如果声明孩子为List<MyObject>,它可以正常工作。但是,当涉及到ObservableList时,您必须声明它是这样的,否则将在解组时发生NullPointerException(但相同的代码在编组时很好)。

private ObservableList<MyObject> children = FXCollections.observableArrayList(); 
+0

我不小心复制了我的XML不正确,但它设置正确后,我检查了链接的网站上。而我的代码几乎与你的一样,除了你没有在方法之上的PRSettings类中的@XmlElement,但由于某种原因,它仍然不起作用 –

+0

我还在我的方法下添加了JAXBException,它似乎是如果我得到一个空指针例外,只要它开始解组 –

+0

所以它完全读取它是真棒,但由于某种原因写入XML以下 ...... 3然后打印出完美的一切。它仍然读得很好,所以它可以以这种方式工作,但是你有一个想法,为什么它可能会这样做?无论如何,感谢您的帮助! –