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

Sim*_*tti 8 xml api json web-services

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

让我举个例子.我们假设我有一个名为Domain的对象.该模型有3个属性(tld,sld,trdname本身)和一种方法valid?,如果所访问的有效返回true.

# 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
Run Code Online (Sandbox Code Playgroud)

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

<result>
  <domain>
    <name>www.google.it</name>
    <tld>it</tld>
    ...
    <valid>true</true>
  </domain>
</result>
Run Code Online (Sandbox Code Playgroud)

但是有些接口使用属性.

<result>
  <domain tld="it" sld="google.com" trd="www" rule="*.foo" name="www.google.it" valid="true" />
</result>
Run Code Online (Sandbox Code Playgroud)

不要忘记属性和价值.

<result>
  <domain tld="it" sld="google.com" trd="www" rule="*.foo" name="www.google.it" valid="true">
    www.google.it
  </domain>
</result>
Run Code Online (Sandbox Code Playgroud)

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

dka*_*man 8

我使用的模式是:

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

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

所以用你的例子我可能会这样做:

<result>
  <domain valid="true">
    <name>www.google.it</name>
    <tld>it</tld>
    ...
  </domain>
</result>
Run Code Online (Sandbox Code Playgroud)


mar*_*c_s 5

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

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

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

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