gpt4 book ai didi

java - 如何使用JAXB解析xml?

转载 作者:行者123 更新时间:2023-12-01 09:44:54 26 4
gpt4 key购买 nike

我想使用 JAXB 将 XML 文件映射到对象。如何像这样转换 XML 文件:

<Contract>
<Variable Name="Address">
<Value>Address</Value>
</Variable>
<Variable Name="FirstName">
<Value>First</Value>
</Variable>
<Variable Name="SecondName">
<Value>Second</Value>
</Variable>
<Parameter Name="id">
<Value>399425</Value>
</Parameter>
<Parameter Name="isComplete">
<Value>True</Value>
</Parameter>
<Parameter Name="templateName">
<Value>Probate Application</Value>
</Parameter>
</Contract>

像这样的java对象:

public class Contract {
private Long id;
private String templateName;
private boolean isComplete;
private Map<String, String> answers = new HashMap<>();

}

或者也许建议一些教程。谢谢

最佳答案

您有两个问题:绑定(bind)<Variable>将元素添加到您的 map 并绑定(bind) <Parameter>元素到不同类型的对象。

我将按此顺序处理问题。

对于 map ,您必须使用 XmlAdapter@XmlJavaTypeAdapter .

编写一个代表您的 <Variable> 的类元素并映射它:

public class Variable{

@XmlAttribute
public String Name;

@XmlElement
public String Value;

//Getters and setters
}

然后编写 XmlAdapter 代码:

public class YourAdapter extends XmlAdapter<List<Variable>,Map<String,String>>{

public Map<String,String> unmarshall(List<Variable> arg0){
//Logic to convert a List<Variable> into a Map<String,String> and return it
}

public List<Variable> marshall(Map<String,String> arg0){
//Logic to convert a Map<String,String> into a List<Variable> and return it
}


}

然后映射您的 Contract 类:

@XmlRootElement
@XmlSeeAlso({Variable.class})
public class Contract{

@XmlElement(name="Variable")
@XmlJavaTypeAdapter(YourAdapter.class)
private Map<String,String> map;

//Getters and setters
}

有了这个,你的 map 就应该可以工作了。

对于第二个问题,您有两种解决方案:使用 JAXB Reference 实现或使用 JAXB MOXy 实现。

With JAXB reference implementation

JAXB 引用实现无法使用 Xpath 进行绑定(bind)。所以这里有一个解决方法。

为您的 <Parameter> 编写第二个类和适配器元素,除了名称之外基本上是相同的,并将此映射用于契约:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({Variable.class,Parameter.class})
public class Contract{

@XmlElement(name="Variable")
@XmlJavaTypeAdapter(YourAdapter.class)
private Map<String,String> map;

@XmlElement(name="Parameter")
@XmlJavaTypeAdapter(YourAdapterForParameter.class)
private Map<String,String> parameterMap;

public Long getId(){
return Long.valueOf(parameterMap.get("id"));
}

public void setId(Long id){
parameterMap.put("id",id.toString());
}

//Same thing for other getters/setters
}

With MOXy implementation

通过 MOXy 实现,您可以使用 @XmlPath和 XPath 使其更简洁:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({Variable.class})
public class Contract{

@XmlPath("./Variable[@Name='id']/Value")
private Long id;

@XmlPath("./Variable[@Name='templateName']/Value")
private String templateName;

@XmlPath("./Variable[@Name='isComplete']/Value")
private boolean isComplete;

@XmlElement(name="Variable")
@XmlJavaTypeAdapter(YourAdapter.class)
private Map<String,String> map;

//Getters and setters
}

有关更多信息/帮助,请参阅 JAXB/MOXy 文档。

关于java - 如何使用JAXB解析xml?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38145367/

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