我正在为Web服务设计API,我无法决定使用XML属性,元素还是混合架构。
让我举个例子。我们假设我有一个名为Domain的对象。此模型有3个属性(tld
,sld
,trd
和name
本身)和方法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(很快)提供。
答案 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示例,将元素用于具有内部结构或顺序重要的任何内容,以及其他所有内容的属性。