gpt4 book ai didi

java - 如何使用jaxb将包含相同元素的不同类型映射到单个java类对象

转载 作者:行者123 更新时间:2023-11-30 09:59:13 24 4
gpt4 key购买 nike

我的问题是客户端发送的 xml 请求包含具有相同名称的不同类型的元素,我需要将其转换为 java 对象。我在下面添加请求。第一个请求是:-

 <root>
<params>
<game>1</game>
</params>
</root>

第二个是:-

<root>
<params>
<game>
<id>1</id>
<name>Lucky 7</name>
<translation>Lucky 7</translation>
</game>
</params>
</root>

我查看了 stakeoverflow,但没有找到解决方案。希望有人能帮忙添加到单个 java 类中,而不是使用多个 java 类。

最佳答案

父元素既有子元素又有文本值,使用@XmlMixed注解通过JAXB解码提取父元素的文本值

试试下面的例子,

游戏.xml

<?xml version="1.0" encoding="UTF-8"?>
<root>
<game>1</game> <!-- text value -->
<game>
<id>1</id> <!-- child element -->
<name>Lucky 7</name>
<translation>Lucky 7</translation>
</game>
</root>

根.java

@XmlRootElement
public class Root {

private List<Game> listGame;

@XmlElement(name="game")
public List<Game> getListGame() {
return listGame;
}

public void setListGame(List<Game> listGame) {
this.listGame = listGame;
}
}

游戏.java

@XmlRootElement
public class Game {

private List<String> textValue;
private String id;
private String name;
private String translation;

@XmlMixed
public List<String> getTextValue() {
return textValue;
}
public void setTextValue(List<String> textValue) {
this.textValue = textValue;
}
@XmlElement
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@XmlElement
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElement
public String getTranslation() {
return translation;
}
public void setTranslation(String translation) {
this.translation = translation;
}
}

使用 JAXB 解码,

File file = new File("game.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Root.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Root root = (Root) jaxbUnmarshaller.unmarshal(file);

for (int i = 0; i < root.getListGame().size(); i++) {
System.out.println("Game Object "+(i+1));
if(root.getListGame().get(i).getTextValue().size()>1){
System.out.println("ID :"+root.getListGame().get(i).getId());
System.out.println("Name :"+root.getListGame().get(i).getName());
System.out.println("Translation :"+root.getListGame().get(i).getTranslation());
}else{
System.out.println("Value :"+root.getListGame().get(i).getTextValue().get(0));
}
System.out.println("------------------------------------");
}

输出,

Game Object 1
Text Value :1
------------------------------------
Game Object 2
ID :1
Name :Lucky 7
Translation :Lucky 7
------------------------------------

更多信息,https://docs.oracle.com/javaee/5/api/javax/xml/bind/annotation/XmlMixed.html

谢谢,

关于java - 如何使用jaxb将包含相同元素的不同类型映射到单个java类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59098927/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com