Web服务API设计:XML元素与属性

时间:2009-11-30 21:43:18

标签: xml web-services json api

我正在为Web服务设计API,我无法决定使用XML属性,元素还是混合架构。

让我举个例子。我们假设我有一个名为Domain的对象。此模型有3个属性(tldsldtrdname本身)和方法valid?,如果域有效,则返回true。 / p>

# I'm using ruby but 
# consider this as pseudo-code
class Domain
  attr_accessor :tld, :sld, :trd, :name

  def valid?
    true # force true
  end
end

我的api叫/domain/parser在输入中获取一个域并返回解析后的响应。第一种可能性是为每个域属性使用一个元素。

<result>
  <domain>
    <name>www.google.it</name>
    <tld>it</tld>
    ...
    <valid>true</true>
  </domain>
</result>

但是有些接口使用属性。

<result>
  <domain tld="it" sld="google.com" trd="www" rule="*.foo" name="www.google.it" valid="true" />
</result>

不要忘记属性和价值。

<result>
  <domain tld="it" sld="google.com" trd="www" rule="*.foo" name="www.google.it" valid="true">
    www.google.it
  </domain>
</result>

在您看来,哪个更强大,更灵活,更富有表现力?另外,请考虑响应将以XML和JSON(很快)提供。

4 个答案:

答案 0 :(得分:8)

我使用的模式是:

  • 元素用于数据
  • 属性用于元数据(即有关数据的数据)

如果您使用XSD架构,那么大多数(如果不是所有的)元数据都应该放在那里,但如果你没有属性,那么它就是好地方。

所以在你的例子中,我可能会这样做:

<result>
  <domain valid="true">
    <name>www.google.it</name>
    <tld>it</tld>
    ...
  </domain>
</result>

答案 1 :(得分:5)

WCF的设计人员选择避免属性,主要是出于性能原因。 WCF默认序列化程序DataContractSerializer不支持属性(因此可能需要考虑),但它比.NET中更灵活的XmlSerializer快10%左右。

因此,如果您看到自己提供要由WCF客户端使用的内容,您可能会尽可能避免使用属性。

属性永远只是“原子的”,例如一个字符串,一个int等 - 元素提供了更多的灵活性。此外,属性从不存在 - 它们总是被添加到元素上。

根据我的个人经验和个人偏好,我很可能会尽量使用元素并尽可能避免使用属性。但这真的只是个人偏好和品味 - 属性在XML中绝对有效,没问题。

答案 2 :(得分:3)

这主要是品味问题,但有一些技术因素。属性稍微受限于它们可以包含的字符。它们的优点是(?)顺序无关紧要,但不能重复。根据您拥有的工具集,这可能会略微影响您的选择

答案 3 :(得分:3)

如果您的数据可以被认为有两个级别,其中一个是核心数据而另一个是某种元数据(例如某些元素的标签),那么您可能希望使用前者的元素和后者,例如:

<result id="1">
  <domain type="default">
    <name unique="false">www.google.it</name>
    <tld>it</tld>
    ...
    <valid>true</true>
  </domain>
</result>

通常,如果您删除所有属性,则剩余数据看起来仍然有意义。

我有时使用的另一个规则是摘要数据的属性和其余的元素。然后,如果我想发送一个摘要列表,例如我只发送顶部元素及其属性,并省略所包含的元素。 E.g。

<result>
  <domain name="www.google.it">
    <tld>it</tld>
    ...
    <valid>true</true>
  </domain>
</result>
列表中的

成为:

<results>
  <domain name="www.google.it" />
  <domain name="www.google.co.uk" />
  <domain name="www.google.com" />
</results>

或者,如果这两种情况都不适用,那么您可能只想根据第二个XML示例,将元素用于具有内部结构或顺序重要的任何内容,以及其他所有内容的属性。