java - 如何解析具有相同名称但不同级别的标签的 XML?

标签 java xml jaxb

我实现了一些后端,并尝试与使用 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/

相关文章:

java - 如何解码 JAXB 中的 &lt;!DOCTYPE> 部分?

java - 如果以 .00 结尾,如何比较 double 的字符串表示

xpath - EclipseLink MOXy : Logical operators in XmlPath annotation

java - 无法在 Camel 中使用 jaxb 解码。不调用处理器

java - Android 中的 SAX 解析问题...空元素?

xml - 非常奇怪的Powershell xml编写行为

xml - 如何从不在重复项中使用结束标记的嵌套 xml 中获取数据?

java - 触发 REST 调用时无法解释某些汉字

java - Json转excel使用java

java - 将 switch 语句与 imageview 可见性连接起来