最佳实践:XML属性与XML元素 - 何时应该使用元素以及何时应该使用属性?

时间:2008-12-27 22:35:53

标签: xml

这个XML数据的格式是正确的,它们是等价的,还是两者之间的权衡?

1

<sitemap>
  <category name="Animals">
    <section title="Dogs">
      <page url="/pics/greatdane.jpg" title="Great Dane"/>
    </section>
  </category>
</sitemap>

2

<sitemap>
  <page>
    <category>Animals</category>
    <section>Dogs</section>
    <title>Great Dane</title>
    <url>/pics/greatdane.jpg</url>    
  </page>
</sitemap>

我已经使用我的样式表实现了第一个示例,它似乎工作正常,但我不确定应该是什么样的正确形式。

10 个答案:

答案 0 :(得分:20)

属性与元素的问题已经存在了十年的大部分时间,并且没有正确的答案。而是考虑差异,并且您应该能够决定使用哪个:

  • 虽然您可以使用DTD或XML Schema对元素强制执行此操作,但只能有一个属性实例;
  • 属性是无序的。元素不是;
  • 如果没有子节点,属性会导致更简洁的语法。比较:

    &lt; page name =“Sitemap”/&gt;

为:

<page>
  <name>Sitemap</name>
</page>

我知道我更喜欢哪一个;

  • 现在不太相关,因为DTD在XML Schema上的使用不多(如果有的话),但我还是会添加它:DTD允许属性的默认值(隐含),但元素没有这样的机制;和
  • 元素,作为elementss,可以拥有自己的子元素和属性。属性显然不能。

因此,从您的示例中,您最内层的<page>元素具有URL属性(尽管由于某种原因它是图像 - 可能是预览图标?如果是,则属性名称具有误导性)。一个网页只有一个URL(通常),这样就可以成为属性的一个很好的例子。

另一方面,如果你想在页面上列出图像,那么显然可能有不止一个,所以你需要元素。

但是,最后,大部分时间都没有正确或错误的答案,这主要是风格问题。

答案 1 :(得分:12)

这两个例子不等同,因为它们形成了不同的层次结构。站点地图是一个类别列表,如第一个示例吗?或者它是第二个例子的页面列表?

答案是与元素与属性问题正交。

在元素与属性问题上: 以下是您转换为属性方法的第二个示例:

<sitemap>
 <page    
  category='Animals'
  section='Dogs'
  title='Great Dane'
  url='/pics/greatdane.jpg'
  /> 
</sitemap>

以上和你的第二个案例是相同的。选择一个与另一个的一个考虑因素是基于您是否可以在将来修改架构。在url元素中添加属性,如下例所示,可能是一个向后兼容的更改。在属性方法中,语义相同的修改是不可能的,因为您不能将属性附加到属性。

<sitemap>
 <page>    
  <category>Animals</category>
  <section>Dogs</section>    
  <title>Great Dane</title>    
  <url nofollow="true">/pics/greatdane.jpg</url>
 </page> 
</sitemap>

答案 2 :(得分:3)

我认为当您考虑如何添加更多狗时,答案非常明显:

<sitemap>
  <category name="Animals">
    <section title="Dogs">
      <page url="/pics/greatdane.jpg" title="Great Dane"/>
      <page url="/pics/wienerdog.jpg" title="Wiener Dog"/>
    </section>
  </category>
</sitemap>

<sitemap>
  <page>
    <category>Animals</category>
    <section>Dogs</section>
    <title>Great Dane</title>
    <url>/pics/greatdane.jpg</url>    
  </page>
  <page>
    <category>Animals</category>
    <section>Dogs</section>
    <title>Wiener Dog</title>
    <url>/pics/wienerdog.jpg</url>
  </page>
</sitemap>

答案 3 :(得分:2)

这种事情通常没有正确或错误的答案。主要取决于您访问数据的方式。

关于第一个问题的一个好处是它很容易,或许以后,支持一个部分中的多个页面和一个类别中的多个部分。在第二个中,信息分布在各个页面上。

答案 4 :(得分:2)

XML是一种可怕的文件格式,最终会发生宗教战争。做任何你觉得当时最好的事情,只要你能证明这一点。但是,您的具体示例有很大不同:

在1中,sitemap封装了一个封装了封装页面的部分的类别。

在2中,sitemap封装了一个封装了三个项目的页面:category,section,title和URL。这三个项目中没有一个包含任何其他项目,它们是兄弟姐妹,通常都在页面中。

作为两种不同的结构,它取决于你的意图。

另一个问题是属性与第一级标签的偏好。但正如我所说,这是一个不同的问题!

答案 5 :(得分:2)

我使用Metadata

的数据和属性元素

答案 6 :(得分:1)

我更喜欢第二个。元素应该用于描述数据(这主要是你正在做的事情)。属性用于与数据无关的值,例如元素的最大大小。

答案 7 :(得分:1)

IBM发布了一篇名为Principles of XML Design的文章,该文章提供了有关何时使用属性与元素的一些指导。我发现这篇文章很有用,你的里程可能会有所不同。

答案 8 :(得分:1)

第一种选择可以更好地扩展。假设您需要添加动物部分的另一个属性,例如该部分的状态。我建议这个代表:

<sitemap>
  <category name="Animals">
    <section title="Dogs" status="draft">
      ...
    </section>
  </category>
</sitemap>

更好地传达了以下事实:

  1. name是类别
  2. 的属性
  3. 一个类别可以有多个部分
  4. status是某个部分的属性;并非该类别中的所有部分都必须具有相同的状态。
  5. 简而言之,它使层次结构更加清晰,并显示哪些属性适用于层次结构的每个级别。

答案 9 :(得分:1)

一个简单的经验法则:如果您可以将数据结构实现为名称/值对的无序映射,则可以使用元素的属性来表示它。如果你不能(例如,如果你有多个名称,或者给定的名称将有多个关联值,或者名称/值对的排序很重要),那么具有属性的元素是错误的表示

其他两个可能导致错误表示的事情:

  • 值包含标记。这个可以在属性值中表示,但它很尴尬,因为所有标记字符都必须转义为实体。此外,标记将不会被解析。
  • 您正在使用XML Schema验证,并且有多组允许的名称/值对。 XML Schema只能为元素定义一组允许的属性,而它可以定义多个互斥的允许子元素集。

使用属性的明显好处是它们会导致更复杂的XML。它们(非常)解析的速度比元素快得多。