- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将 JAXB 注释添加到一个类中,以便解码与此类似的 XML(注意我不需要将 java bean 编码到 XML...):
<fixture_statistics id="3812596">
<home_team_stats id="2">
<id>2</id>
<tackles>58</tackles>
<possession>1868</possession>
<territory>2603</territory>
<minutes_in_22>1316</minutes_in_22>
...
</home_team_stats>
<guest_team_stats id="21061">
<id>21061</id>
<tackles>20</tackles>
<possession>3114</possession>
<territory>2379</territory>
<minutes_in_22>1171</minutes_in_22>
...
</guest_team_stats>
<home_player_1 id="2306143" teamid="2">
<id>2306143</id>
<tackles>3</tackles>
<metres_gained>38</metres_gained>
...
</home_player_1>
<home_player_1 id="2306143" teamid="2">
<id>2306143</id>
<tackles>3</tackles>
<metres_gained>38</metres_gained>
...
</home_player_1>
<home_player_1 id="2306143" teamid="2">
<id>2306143</id>
<tackles>3</tackles>
<metres_gained>38</metres_gained>
...
</home_player_1>
...
<guest_player_1 id="2306143" teamid="2">
<id>2306143</id>
<tackles>3</tackles>
<metres_gained>38</metres_gained>
...
</guest_player_1>
<guest_player_2 id="2306143" teamid="2">
<id>2306143</id>
<tackles>3</tackles>
<metres_gained>38</metres_gained>
...
</guest_player_2>
<guest_player_3 id="2306143" teamid="2">
<id>2306143</id>
<tackles>3</tackles>
<metres_gained>38</metres_gained>
...
</guest_player_3>
...
</fixture_statistics>
* 请注意,当我复制并粘贴此问题时,请忽略某些元素值...
我已成功将“fixture_statistics”、“home_team_stats”和“guest_team_stats”元素映射到各自的类,并且我能够正确解码这些元素,但我遇到了“home_player_n”和“guest_player_n”元素。我创建了一个类,其中包含在这些元素中找到的属性,但我不知道如何处理这些元素具有不同名称的事实 - “home_player_1”到“home_player_22”,对于 guest 玩家也是如此。
这是我的赛程统计类(class)和我的赛程球员统计类(class)的示例,以便有人可以指出我哪里出错了......
@XmlRootElement(name = "fixture_statistics")
@XmlAccessorType(XmlAccessType.FIELD)
public class FixtureStatistics {
private Collection<FixturePlayerStatistics> homeTeamPlayerStatistics = new ArrayList<>();
private Collection<FixturePlayerStatistics> guestTeamPlayerStatistics = new ArrayList<>();
}
@XmlAccessorType(XmlAccessType.FIELD)
public class FixturePlayerStatistics {
@XmlElement(name="id")
private Long playerId;
private Integer tackles;
@XmlElement(name="metres_gained")
private Integer metresGained;
}
在 FixturePlayerStatistics 类上,我无法添加 XMlRootElement 注释,因为该元素可能是 44 个字符串中的 1 个,而且我还暂时从 FixtureStatistics 类中的集合中删除了任何注释,因为我真的不确定那里会发生什么。我尝试过使用 @XmlElementRef 来指定所有可能的元素名称,但这对我来说还不起作用,而且 XML 也无法更改,而且我没有可使用的架构,只有 API 调用生成的 XML。
最佳答案
有一些不同的选项可以支持此用例。但总的来说,我建议避免将索引应用于元素名称的情况。
选项#1 - 单独的字段/属性
处理此用例的一种方法是为 22 名客队玩家和 22 名主队玩家各拥有一个单独的 field /属性。
package forum13219778;
import javax.xml.bind.annotation.*;
@XmlRootElement(name = "fixture_statistics")
@XmlAccessorType(XmlAccessType.FIELD)
public class FixtureStatistics {
FixturePlayerStatistics guest_player_1;
FixturePlayerStatistics guest_player_2;
FixturePlayerStatistics guest_player_3;
...
FixturePlayerStatistics guest_player_22;
FixturePlayerStatistics home_player_1;
FixturePlayerStatistics home_player_2;
FixturePlayerStatistics home_player_3;
...
FixturePlayerStatistics home_player_22;
}
<小时/>
选项 #2 - 使用 SAX XMLFilter
去掉_#后缀
如果您的用例仅处理解码,那么您可以使用 SAX XMLFilter
要去掉每个元素和 JAXB 注释中的唯一后缀,只需映射到 home_player
和guest_player
。对于 XMLFilter
示例参见:
选项 #3 - 使用 @XmlElementRefs
和一个ObjectFactory
FixtureStatistics
要使用@XmlElementRefs
/@XmlElementRef
您需要更改集合以保存 JAXBElement<FixturePlayerStatistics>
的实例。 JAXBElement
将用于保存元素名称信息。
package forum13219778;
import java.util.*;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;
@XmlRootElement(name = "fixture_statistics")
@XmlAccessorType(XmlAccessType.FIELD)
public class FixtureStatistics {
@XmlElementRefs({
@XmlElementRef(name="home_player_1"),
@XmlElementRef(name="home_player_2"),
@XmlElementRef(name="home_player_3")
})
private Collection<JAXBElement<FixturePlayerStatistics>> homeTeamPlayerStatistics = new ArrayList<>();
@XmlElementRefs({
@XmlElementRef(name="guest_player_1"),
@XmlElementRef(name="guest_player_2"),
@XmlElementRef(name="guest_player_3")
})
private Collection<JAXBElement<FixturePlayerStatistics>> guestTeamPlayerStatistics = new ArrayList<>();
}
对象工厂
与 @XmlElementRef
结合使用您需要使用 @XmlElementDecl
声明根元素注解。这是通过一个带有 @XmlRegistry
注释的对象工厂类来完成的。 .
package forum13219778;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;
import javax.xml.namespace.QName;
@XmlRegistry
public class ObjectFactory {
@XmlElementDecl(name = "home_player_1")
public JAXBElement<FixturePlayerStatistics> createHomePlayer1(FixturePlayerStatistics player) {
return new JAXBElement<FixturePlayerStatistics>(new QName("home_player_1"), FixturePlayerStatistics.class, player);
}
@XmlElementDecl(name = "home_player_2")
public JAXBElement<FixturePlayerStatistics> createHomePlayer2(FixturePlayerStatistics player) {
return new JAXBElement<FixturePlayerStatistics>(new QName("home_player_2"), FixturePlayerStatistics.class, player);
}
@XmlElementDecl(name = "home_player_3")
public JAXBElement<FixturePlayerStatistics> createHomePlayer3(FixturePlayerStatistics player) {
return new JAXBElement<FixturePlayerStatistics>(new QName("home_player_3"), FixturePlayerStatistics.class, player);
}
@XmlElementDecl(name = "guest_player_1")
public JAXBElement<FixturePlayerStatistics> createGuestPlayer1(FixturePlayerStatistics player) {
return new JAXBElement<FixturePlayerStatistics>(new QName("guest_player_1"), FixturePlayerStatistics.class, player);
}
@XmlElementDecl(name = "guest_player_2")
public JAXBElement<FixturePlayerStatistics> createGuestPlayer2(FixturePlayerStatistics player) {
return new JAXBElement<FixturePlayerStatistics>(new QName("guest_player_2"), FixturePlayerStatistics.class, player);
}
@XmlElementDecl(name = "guest_player_3")
public JAXBElement<FixturePlayerStatistics> createGuestPlayer3(FixturePlayerStatistics player) {
return new JAXBElement<FixturePlayerStatistics>(new QName("guest_player_3"), FixturePlayerStatistics.class, player);
}
}
演示
package forum13219778;
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(FixtureStatistics.class, ObjectFactory.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum13219778/input.xml");
FixtureStatistics fs = (FixtureStatistics) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(fs, System.out);
}
}
关于java - 读取具有不同名称但类型相同的元素列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13219778/
我正在尝试编写一个相当多态的库。我遇到了一种更容易表现出来却很难说出来的情况。它看起来有点像这样: {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE
谁能解释一下这个表达式是如何工作的? type = type || 'any'; 这是否意味着如果类型未定义则使用“任意”? 最佳答案 如果 type 为“falsy”(即 false,或 undef
我有一个界面,在IAnimal.fs中, namespace Kingdom type IAnimal = abstract member Eat : Food -> unit 以及另一个成功
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
在 C# 中,default(Nullable) 之间有区别吗? (或 default(long?) )和 default(long) ? Long只是一个例子,它可以是任何其他struct类型。 最
假设我有一个案例类: case class Foo(num: Int, str: String, bool: Boolean) 现在我还有一个简单的包装器: sealed trait Wrapper[
这个问题在这里已经有了答案: Create C# delegate type with ref parameter at runtime (1 个回答) 关闭 2 年前。 为了即时创建委托(dele
我正在尝试获取图像的 dct。一开始我遇到了错误 The function/feature is not implemented (Odd-size DCT's are not implemented
我正在尝试使用 AFNetworking 的 AFPropertyListRequestOperation,但是当我尝试下载它时,出现错误 预期的内容类型{( “应用程序/x-plist” )}, 得
我在下面收到错误。我知道这段代码的意思,但我不知道界面应该是什么样子: Element implicitly has an 'any' type because index expression is
我尝试将 SignalType 从 ReactiveCocoa 扩展为自定义 ErrorType,代码如下所示 enum MyError: ErrorType { // .. cases }
我无法在任何其他问题中找到答案。假设我有一个抽象父类(super class) Abstract0,它有两个子类 Concrete1 和 Concrete1。我希望能够在 Abstract0 中定义类
我想知道为什么这个索引没有用在 RANGE 类型中,而是用在 INDEX 中: 索引: CREATE INDEX myindex ON orders(order_date); 查询: EXPLAIN
我正在使用 RxJava,现在我尝试通过提供 lambda 来订阅可观察对象: observableProvider.stringForKey(CURRENT_DELETED_ID) .sub
我已经尝试了几乎所有解决问题的方法,其中包括。为 提供类型使用app.use(express.static('public'))还有更多,但我似乎无法为此找到解决方案。 index.js : imp
以下哪个 CSS 选择器更快? input[type="submit"] { /* styles */ } 或 [type="submit"] { /* styles */ } 只是好
我不知道这个设置有什么问题,我在 IDEA 中获得了所有注释(@Controller、@Repository、@Service),它在行号左侧显示 bean,然后转到该 bean。 这是错误: 14-
我听从了建议 registering java function as a callback in C function并且可以使用“简单”类型(例如整数和字符串)进行回调,例如: jstring j
有一些 java 类,加载到 Oracle 数据库(版本 11g)和 pl/sql 函数包装器: create or replace function getDataFromJava( in_uLis
我已经从 David Walsh 的 css 动画回调中获取代码并将其修改为 TypeScript。但是,我收到一个错误,我不知道为什么: interface IBrowserPrefix { [
我是一名优秀的程序员,十分优秀!