应该将列表数组元素包装在xml表示中吗?

时间:2017-06-06 07:30:07

标签: java xml

创建REST / XML Web服务并显示List个对象时:列表元素是否应包含在列表元素中(例如<persons>),或者响应是否应列出多个<person>元素?

示例:

@XmlElement
private List<Person> persons;

public class Person {
    private String name;
    private int age;
    //...
}

嵌套:

<rsp>
 <persons>
   <person>
     <name />
     <age />
   </person>
   <person>
    ...
   </person>
 </persons>
</rsp>

平的:

<rsp>
   <person>
     <name />
     <age />
   </person>
   <person>
    ...
   </person>
</rsp>

4 个答案:

答案 0 :(得分:4)

我会把它包裹起来。因为添加像列表大小

这样的元数据更自然
<persons size="42">
  <person>
    ...
  </person>
  <person>
    ...
  </person>
  .
  .
  .
<persons>

答案 1 :(得分:4)

它很容易将列表包装在像persons这样的父元素中。这样做有两个原因:

正如@tanyehzheng所指出的,它允许向列表中添加属性,如大小。

使用包装样式,它允许您的响应对象<rsp>可以扩展,以更清洁的方式包含其他对象。说明天我们希望添加如下数据(这只是一个例子)

<rsp>
   <persons>
      <person>
       <name />
       <age />
      </person>
      <person>
       ...
      </person>
  </persons>
  <performanceInfo>
    <processingTime>122</processingTime>
  </performanceInfo>
</rsp>

答案 2 :(得分:2)

当它出现时,我将通过几个众所周知的RESTFUL接口(或至少在您的服务环境中使用的接口)。我会尽量保持一致,这样您的开发人员生态系统就可以直观地了解您设计的API。

从技术角度来看,我怀疑元素的包装可以使解析或应用程序编码更有效。当然,能够为列表本身提供属性(如 tanyehzheng已经说过了。)

就个人而言,我更喜欢包装的XML,但不是出于任何技术原因。在XML编辑器/查看器中,元素可以折叠,因此可以使人类的响应更加简洁。

答案 3 :(得分:1)

XmlElement注释来自JAXB 2规范,用于将XML表示为Java类/对象图,反之亦然。 JAXB 2绑定规则基本上是基于将XML模式定义映射到Java类。可以通过XML Schema maxOccurs="unbounded"属性多次出现的元素,或者在其包含类型中大于1的maxOccurs值默认表示为list属性(元素项的Java.util.List ),或者不太常见,作为具有访问者的索引属性,例如getProp(int index) Prop元素名称。

所以我会说除非特定要求另有规定,否则我使用包装元素来表示您描述的典型用例。但需要注意的是,您希望Java成员名称采用复数形式,而在XML中,您需要单数形式。在您的示例中,您将要避免使用诸如Persons之类的Java方法签名的XML元素名称List<Person> getPersons(),并且可以使用@XmlElement(Name = Person)注释来获取XML而是单数形式的元素。

您的问题背后有更大的讨论:XML,如SGML(XML和HTML的常见超集),是用于表示半结构化数据的 text 格式(最初设计用于取代) HTML,但没有成功)。因此,根据定义,SGML / XML所设计的数据类型并未在Java组件模型中充分表示,以寻求将Java类/对象完全映射到标记元素。相反,DOM表示或对标记元素的顺序访问的另一种表示,其中彼此之间的元素的文档顺序被尊重,可以说是更自然的契合。事实上,JAXB 1具有更复杂的映射规则,可以往返于元素的文档顺序。但事实证明,对于大多数时候使用XML的相对简单的面向数据的用例,这并没有用。因此,JAXB 2旨在更轻松地捕获像您这样的面向数据的用例。