代码之家  ›  专栏  ›  技术社区  ›  Simone Carletti

Web服务API设计:XML元素与属性[重复]

  •  8
  • Simone Carletti  · 技术社区  · 15 年前

    这个问题已经有了答案:

    我正在为Web服务设计一个API,我不能决定使用XML属性、元素还是混合架构。

    我给你举个例子。假设我有一个叫做域的对象。此模型有3个属性( tld , sld , trd 以及 name 以及一种方法 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
    

    我的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 回复  |  直到 12 年前
        1
  •  8
  •   dkackman Srinivas Kokkula    15 年前

    我使用的模式是:

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

    如果您使用的是XSD模式的大部分(如果不是所有的话),那么您的元数据都应该放在那里,但是如果您不使用属性,那么对于它来说是个好地方。

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

    <result>
      <domain valid="true">
        <name>www.google.it</name>
        <tld>it</tld>
        ...
      </domain>
    </result>
    
        2
  •  5
  •   marc_s Anurag    15 年前

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

    因此,如果您曾经看到自己在为WCF客户机提供要使用的内容,那么如果可能的话,您可能会试图避开属性。

    属性只能是“原子的”,例如字符串、int等。—元素提供了更大的灵活性。此外,属性本身并不存在-它们总是附加到元素上。

    从我的个人经验和个人偏好来看,我很可能会尽量使用元素,尽量避免使用属性。但这实际上只是个人偏好和品味——这些属性在XML中是绝对有效的,没问题。

        3
  •  3
  •   L. Cornelius Dol    12 年前

    这主要是一个品味问题,但也有一些技术上的考虑。属性在可以包含哪些字符方面受到了稍微更大的限制。他们有优势(?)这个命令无关紧要,但不能重复。这可能会根据您拥有的工具集稍微影响您的选择。

        4
  •  3
  •   L. Cornelius Dol    12 年前

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

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

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

    我有时使用的另一个规则是汇总数据的属性和其余的元素。然后,如果我想发送一个摘要列表,例如,我只发送顶部元素加上它的属性,并忽略包含的元素。例如。

    <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示例为所有其他内容使用属性。