2008-12-27 71 views
23

这将是这个XML数据的正确格式,它们是等价的还是两者之间的权衡?最佳实践:XML属性vs 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> 

我已经实现了第一个例子与我的样式表,它似乎做工精细,但我不能确定什么样的正确形式应是。

+1

这是一个不错的标题的好问题。 – 2008-12-27 23:15:43

+0

是的,真的很好的问题,但请更改标题。 – 2008-12-28 00:33:06

回答

20

属性与元素的问题已经出现在十年的大部分时间里,没有正确的答案。相反,考虑差异和你应该能够决定使用哪种:

  • 可以有一个属性只有一个实例,虽然你可以使用DTD或XML Schema元素执行本;
  • 属性无序。元素不是;
  • 如果没有孩子,则属性会导致更简洁的语法。比较:

    <页面名称= “网站地图”/>

到:

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

我知道我喜欢哪一个;

  • 不是真的有关,因为现在的DTD不使用多少(如果有的话)在XML架构,但无论如何,我会添加:允许DTD中的默认值(暗示)的属性,但没有这样的机制,要素;和
  • 作为elementss的元素可以拥有自己的子元素和属性。属性显然不能。

所以,从你的榜样,你的内心<page>元素有一个URL属性(虽然这是出于某种原因的图像 - 也许预览图标,如果是这样的属性名称是误导)。一个网页只有一个URL(通常),因此这可能是某个属性的好例子。

另一方面,如果你想列出页面上的图像,显​​然可能有多个,所以你需要的元素。

但是,最后,大多数时候没有正确或错误的答案,这主要是一个风格问题。

2

这类事情通常没有正确或错误的答案。主要取决于你如何访问你的数据。

第一个问题的一个好处是,它很容易(也许以后)能够支持某个分类中的多个页面和一个分类中的多个分段。第二个信息是跨页面传播的。

2

XML是可怕的文件格式,并最终在宗教战争。只要你能证明这一点,你就可以做任何你感觉最好的事情。但是,您的特定示例显着不同:

1,sitemap封装封装封装页面的部分的类别。

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

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

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

1

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

12

这两个示例并不等价,因为它们形成不同的层次结构。网站地图是类别列表,就像第一个例子一样?还是像第二个例子那样的页面列表?

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

在元件VS属性问题: 这里是变换到一个属性的方法的第二个例子:

<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> 
1

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

1

第一替代缩放好一点属性。假设您需要添加动物节的另一个属性,例如节的状态。我认为,这表示:

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

确实传达了以下事实的一个更好的工作:

  1. 名是该类别的属性
  2. 类别可以有多个部分
  3. 状态部分的财产;并非所有类别中的所有部分都必须具有相同的状态。

总之,它使分层结构更加清晰,并显示哪些属性适用于层次结构的每个级别。

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> 
1

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

有两件事情可以使这个错误表示:

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

使用属性的一个显而易见的好处是它们导致了精确的XML。它们的分析速度也比元素快(非常快)。