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

最佳实践:XML属性vs XML元素-我应该何时使用元素以及何时使用属性?,xml,Xml,对于这种XML数据,哪种格式是正确的,它们是等效的,还是两者之间存在权衡 一, 二, 动物 狗 大丹 /pics/greatdane.jpg 我已经用我的样式表实现了第一个示例,它似乎工作得很好,但我不确定正确的形式应该是什么。这类问题通常没有正确或错误的答案。主要取决于您需要如何访问数据 第一个的一个优点是,它很容易(也许以后)支持一个部分中的多个页面和一个类别中的多个部分。在第二种情况下,信息是跨页面传播的。XML是可怕的文件格式,最终导致宗教战争。只要你有理由,做你当时觉得最好的事

对于这种XML数据,哪种格式是正确的,它们是等效的,还是两者之间存在权衡

一,


二,


动物
狗
大丹
/pics/greatdane.jpg

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

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


第一个的一个优点是,它很容易(也许以后)支持一个部分中的多个页面和一个类别中的多个部分。在第二种情况下,信息是跨页面传播的。

XML是可怕的文件格式,最终导致宗教战争。只要你有理由,做你当时觉得最好的事情。但是,您的具体示例有很大不同:

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

在2中,sitemap封装了一个页面,该页面封装了三个项目:类别、节、标题和URL。这三个项目都不包含任何其他项目,它们是兄弟项目,通常都保存在页面中

作为两种不同的结构,它取决于您想要的


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

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

属性与元素的问题已经存在了十年的大部分时间,没有正确的答案。取而代之的是考虑差异,从中你可以决定使用哪一种:

  • 一个属性只能有一个实例,尽管您可以使用DTD或XML模式对元素强制执行该实例
  • 属性是无序的。元素不是
  • 如果没有子级,属性将导致更简洁的语法。比较:

致:


网站地图
我知道我更喜欢哪一个

  • 现在不太相关,因为DTD在XML模式上使用得不多(如果有的话),但我还是要添加它:DTD允许属性使用默认值(隐含),但元素没有这样的机制;及
  • 元素是无元素的,可以有自己的子元素和属性。属性显然不能
因此,从您的示例中,您最里面的
元素有一个URL属性(尽管出于某种原因它是一个图像——可能是一个预览图标?如果是这样,那么属性名称是误导性的)。一个网页(通常)只有一个URL,所以这是一个很好的例子,可以作为一个属性

<sitemap>
 <page>    
  <category>Animals</category>
  <section>Dogs</section>    
  <title>Great Dane</title>    
  <url nofollow="true">/pics/greatdane.jpg</url>
 </page> 
</sitemap>
另一方面,如果您想在页面上列出图像,显然可能不止一个,因此您需要元素


但是,归根结底,大多数情况下没有正确或错误的答案,这在很大程度上是一个风格问题。

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

这个问题的答案与元素对属性的问题是正交的

关于元素与属性的问题: 下面是转换为属性方法的第二个示例:

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

动物
狗
大丹
/pics/greatdane.jpg

IBM发布了一篇名为的文章,提供了关于何时使用属性和元素的一些指导原则。我发现这篇文章很有用,你的里程数可能会有所不同。

我使用元素作为数据和属性,第一种方法的缩放效果更好。假设您需要添加动物节的另一个属性,例如该节的状态。我建议这一陈述:

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

...
更好地传达以下事实:

  • 名称是类别的属性
  • 一个类别可以有多个部分
  • 状态是节的属性;并非类别中的所有节都必须具有相同的状态

  • 简而言之,它使层次结构更加清晰,并显示了在层次结构的每个层次上应用哪些属性。

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

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

    
    动物
    狗
    大丹
    /pics/greatdane.jpg
    动物
    狗
    维也纳犬
    /pics/wienerdog.jpg
    
    一条简单的经验法则:如果可以将数据结构实现为名称/值对的无序映射,那么可以使用元素的属性来表示它。如果不能(例如,如果您将有多个名称,或者给定的名称将有多个关联的值,或者名称/值对的顺序很重要),那么具有属性的元素是错误的表示形式

    另外两个因素可能会使其成为错误的表述:

    <sitemap>
      <category name="Animals">
        <section title="Dogs" status="draft">
          ...
        </section>
      </category>
    </sitemap>
    
    • 这些值包含标记。这可以用属性值表示,但这很尴尬,因为所有标记字符都必须转义到实体中。此外,标记也不会被解析
    • 您使用的是XML模式验证,并且
      <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>