我实现了一些后端,并尝试与使用 XML 作为传输的其余服务器集成。 Spring 使用 JAXB 自动处理 XML 解析。但是来自该服务器的一些请求和响应具有相同名称的标签。例如:
<transaction type="reserve">
<date>2014-12-11</date>
<station-from>London</station-from>
<station-to>Paris</station-to>
<place>1</place>
<detail>
<transaction id-seller="123">
<some-tag>bla-bla</some-tag>
</transaction>
</detail>
</transaction>
Java代码:
@XmlRootElement(name = "transaction")
public class Transaction {
private String date;
private String stationFrom;
private String stationTo;
private int place;
private Detail detail;
public Transaction() {}
@XmlElement(name = "date")
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
@XmlElement(name = "station-from")
public String getStationFrom() {
return stationFrom;
}
public void setStationFrom(String stationFrom) {
this.stationFrom = stationFrom;
}
@XmlElement(name = "station-to")
public String getStationTo() {
return stationTo;
}
public void setStationTo(String stationTo) {
this.stationTo = stationTo;
}
@XmlElement(name = "place")
public int getPlace() {
return place;
}
public void setPlace(int place) {
this.place = place;
}
@XmlRootElement(name = "detail")
public static class Detail {
private Transaction transaction;
public Detail() {}
@XmlElement(name = "transaction")
public Transaction getTransaction() {
return transaction;
}
public void setTransaction(Transaction transaction) {
this.transaction = transaction;
}
@XmlRootElement(name = "transaction")
public static class DetailTransaction {
private String idSeller;
private String someTag;
public DetailTransaction() {}
@XmlAttribute(name = "id-seller")
public String getIdSeller() {
return idSeller;
}
public void setIdSeller(String idSeller) {
this.idSeller = idSeller;
}
@XmlAttribute(name = "some-tag")
public String getSomeTag() {
return someTag;
}
public void setSomeTag(String someTag) {
this.someTag = someTag;
}
}
}
}
有两个具有相同名称的标签 - transaction。我该如何通过 JAXB 处理它?顺便说一句,我没有 XSD 架构,该服务不提供它。在 tomcat 中我遇到了这个异常:
Two classes have the same XML type name "transaction". Use @XmlType.name and @XmlType.namespace to assign different names to them.
实际上这个例子与我从这个 REST 服务器获得的复杂响应无关,但想法是在很多地方他们使用具有相同名称的标签,但在不同的地方和不同的级别。
最佳答案
我发现以下问题:
- 到处都有
@XmlRootElement
。 Detail
使用Transaction
,而不是DetailTransaction
。- 您的
Transaction
错过了transaction
的getter/setter。
尝试以下操作:
@XmlRootElement(name = "transaction")
public class Transaction {
private String date;
private String stationFrom;
private String stationTo;
private int place;
private Detail detail;
public Transaction() {}
@XmlElement(name = "date")
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
@XmlElement(name = "station-from")
public String getStationFrom() {
return stationFrom;
}
public void setStationFrom(String stationFrom) {
this.stationFrom = stationFrom;
}
@XmlElement(name = "station-to")
public String getStationTo() {
return stationTo;
}
public void setStationTo(String stationTo) {
this.stationTo = stationTo;
}
@XmlElement(name = "place")
public int getPlace() {
return place;
}
public void setPlace(int place) {
this.place = place;
}
@XmlElement(name = "detail")
public Detail getDetail() {
return detail;
}
public void setDetail(Detail detail) {
this.detail = detail;
}
public static class Detail {
private DetailTransaction transaction;
public Detail() {}
@XmlElement(name = "transaction")
public DetailTransaction getTransaction() {
return transaction;
}
public void setTransaction(DetailTransaction transaction) {
this.transaction = transaction;
}
public static class DetailTransaction {
private String idSeller;
private String someTag;
public DetailTransaction() {}
@XmlAttribute(name = "id-seller")
public String getIdSeller() {
return idSeller;
}
public void setIdSeller(String idSeller) {
this.idSeller = idSeller;
}
@XmlAttribute(name = "some-tag")
public String getSomeTag() {
return someTag;
}
public void setSomeTag(String someTag) {
this.someTag = someTag;
}
}
}
}
未经测试,只是稍微修改了你的代码。并在使用实际服务进行测试之前进行单元测试(实例化上下文、解码示例 XML、编码示例对象)。
关于java - 如何解析具有相同名称但不同级别的标签的 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26897910/