85

我正在从 W3Schools 学习 XML 属性

作者提到以下内容(强调我的):

XML 元素与属性

<person sex="female">
  <firstname>Anna</firstname>
  <lastname>Smith</lastname>
</person>

<person>
  <sex>female</sex>
  <firstname>Anna</firstname>
  <lastname>Smith</lastname>
</person>

在第一个示例中,性别是一个属性。最后,性是一个元素。这两个示例都提供了相同的信息。

没有关于何时使用属性和何时使用元素的规则。属性在 HTML 中很方便。在 XML 中,我的建议是避免使用它们。改为使用元素。

避免使用 XML 属性?

使用属性的一些问题是:

  • 属性不能包含多个值(元素可以)
  • 属性不能包含树结构(元素可以)
  • 属性不易扩展(以备将来更改)

属性难以阅读和维护。使用数据元素。对与数据不相关的信息使用属性。

那么作者的观点是著名的,还是 XML 中的最佳实践?

应该避免使用 XML 中的属性吗?

W3Schools 还提到了以下内容(强调我的):

元数据的 XML 属性

有时 ID 引用会分配给元素。这些 ID 可用于标识 XML 元素,其方式与 HTML 中的 ID 属性非常相似。这个例子证明了这一点:

<messages>
  <note id="501">
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
  </note>
  <note id="502">
    <to>Jani</to>
    <from>Tove</from>
    <heading>Re: Reminder</heading>
    <body>I will not</body>
  </note>
</messages>

上面的 ID 只是一个标识符,用来识别不同的音符。它不是笔记本身的一部分。

我在这里想说的是元数据(关于数据的数据)应该作为属性存储,而数据本身应该作为元素存储。

4

13 回答 13

66

属性或元素的使用通常由您尝试建模的数据决定。

例如,如果某个实体是数据的一部分,则建议将其设为元素。例如,员工姓名是员工数据的重要组成部分。

现在,如果您想传达有关数据的METADATA(提供有关数据的附加信息的东西)但实际上并不是数据的一部分,那么最好将其设为属性。例如,假设每个员工都有一个后端处理所需的 GUID,那么将其作为属性会更好。(GUID 不是向查看 xml 的人传达真正有用的信息的东西,但对于其他目的可能是必需的)

没有这样的规则说某物应该是属性或元素。

没有必要不惜一切代价避免属性..有时它们比元素更容易建模。这实际上取决于您要表示的数据。

于 2009-07-08T08:33:12.847 回答
42

OP 五年后我的 0.02 正好相反。让我解释。

  1. 在对相似数据和该数据的属性进行分组时使用元素。
  2. 不要对所有事情都使用元素。
  3. 如果数据重复(1到很多),它可能是一个元素
  4. 如果数据从不重复,并且只有在与其他事物相关时才有意义,那么它就是一个属性。
  5. 如果数据没有其他属性(即名称),那么它就是一个属性
  6. 将类似元素组合在一起以支持集合解析(即/xml/character)
  7. 重用相似的元素名称来支持解析数据
  8. 永远不要元素名称中使用数字来显示位置。(即character1,character2)这种做法使得解析非常困难(参见#6,解析代码必须/character1,/character2等,而不仅仅是/character。

考虑另一种方式:

  • 首先将所有数据视为一个属性。
  • 在逻辑上将属性分组为元素。如果您知道数据,则很少需要将属性转换为元素。您可能已经知道何时需要某个元素(集合或重复数据)
  • 将元素按逻辑分组在一起
  • 当您遇到需要扩展的情况时,根据上述流程的逻辑结构添加新元素/属性。添加新的子元素集合不会“破坏”您的设计,并且随着时间的推移会更容易阅读。

例如,看一个简单的书籍和主要人物的集合,标题永远不会有“孩子”,它是一个简单的元素。每个角色都有名字和年龄。

    <book title='Hitchhiker&apos;s Guide to the Galaxy' author='Douglas Adams'>
        <character name='Zaphod Beeblebrox' age='100'/>
        <character name='Arthur Dent' age='42'/>
        <character name='Ford Prefect' age='182'/>
    </book>

    <book title='On the Road' author='Jack Kerouac'>
        <character name='Dean Moriarty' age='30'/>
        <character name='Old Bull Lee' age='42'/>
        <character name='Sal Paradise' age='42'/>
    </book>

你可以争辩说一本书可以有多个作者。好的,只需通过添加新的作者元素来扩展(可选地删除原始的@author)。当然,您已经破坏了原始结构,但实际上它非常罕见,而且很容易解决。假设单个作者的原始 XML 的任何使用者无论如何都必须更改(他们可能会更改其数据库以将作者从“书”表中的列移动到“作者”表)。

<book title='Hitchhiker&apos;s Guide to the Galaxy'>
    <author name='Douglas Adams'/>
    <author name='Some Other Guy'/>
    <character name='Zaphod Beeblebrox' age='100'/>
    <character name='Arthur Dent' age='42'>
    <character name='Ford Prefect' age='182'/>
</book>
于 2014-09-10T11:32:31.597 回答
28

最重要的是,将内容放入属性中可以减少 XML 的冗长。

比较

<person name="John" age="23" sex="m"/>

反对

<person>
    <name>
        John
    </name>
    <age>
        <years>
            23
        </years>
    </age>
    <sex>
        m
    </sex>
</person>

是的,这有点偏颇和夸张,但你明白了

于 2009-07-08T11:55:00.287 回答
19

我用谷歌搜索确切的问题。首先,我阅读了这篇文章,XML 设计原则 - 何时使用元素与属性。不过,这样一个简单的问题感觉太长了。无论如何,我已经阅读了有关该主题的所有答案,但没有找到令人满意的摘要。因此,我回到了后一篇文章。这是一个摘要:

我什么时候使用元素,什么时候使用属性来呈现信息?

  • 如果有问题的信息本身可以用元素标记,请将其放入元素中。
  • 如果信息适用于属性形式,但最终可能成为同一元素上的多个同名属性,请改用子元素。
  • 如果要求信息采用标准的类似 DTD 的属性类型,例如 ID、IDREF 或 ENTITY,请使用属性。
  • 如果不应针对空白对信息进行规范化,请使用元素。(XML 处理器以可以更改属性值的原始文本的方式对属性进行规范化。)

核心内容原则

如果您认为所讨论的信息是在 XML 中表达或交流的基本材料的一部分,请将其放在一个元素中。如果您认为信息是主要通信的外围信息或附带信息,或者纯粹旨在帮助应用程序处理主要通信,请使用属性。

结构化信息原理

如果信息以结构化的形式表达,特别是如果该结构是可扩展的,则使用元素。如果信息表示为原子标记,请使用属性。

可读性原则

如果信息旨在被人阅读和理解,请使用元素。如果信息最容易被机器理解和消化,请使用属性。

元素/属性绑定原理

如果您需要一个元素的值被另一个属性修改,请使用该元素。[..]让一个属性修改另一个属性几乎总是一个糟糕的主意。

这是文章中重要部分的简短摘要。如果您希望查看每个案例的示例和完整描述,请参阅原始文章。

于 2013-04-27T15:37:30.743 回答
7

属性模型映射。元素上的一组属性直接同构到名称/值映射中,其中值是文本或任何可序列化的值类型。例如,在 C# 中,任何Dictionary<string, string>对象都可以表示为 XML 属性列表,反之亦然。

元素显然不是这种情况。虽然您始终可以将名称/值映射转换为一组元素,但情况并非如此,例如:

<map>
   <key1>value</key1>
   <key1>another value</key1>
   <key2>a third value</key2>
</map>

如果将其转换为地图,您将失去两件事:与 关联的多个值,以及出现在 之前key1的事实。key1key2

如果您查看用于以这种格式更新信息的 DOM 代码,其意义就会变得更加清晰。例如,写这个很简单:

foreach (string key in map.Keys)
{
   mapElement.SetAttribute(key, map[key]);
}

该代码简洁明了。对比一下,说:

foreach (string key in map.Keys)
{
   keyElement = mapElement.SelectSingleNode(key);
   if (keyElement == null)
   {
      keyElement = mapElement.OwnerDocument.CreateElement(key);
      mapElement.AppendChild(keyElement);
   }
   keyElement.InnerText = value;
}
于 2009-07-08T17:01:21.973 回答
5

您不能将 CDATA 放入属性中。根据我的经验,你迟早会想要将单引号、双引号和/或整个 XML 文档放入“成员”中,如果它是一个属性,那么你会诅咒使用属性的人的元素。

注意:我使用 XML 的经验主要涉及清理其他人的。这些人似乎遵循了一句古老的格言“XML就像暴力。如果使用它还没有解决你的问题,那么你还没有使用足够多。”

于 2009-07-09T02:36:05.100 回答
4

这是一个例子,其中属性是关于数据的数据。

数据库由它们的 ID 属性命名。

数据库的“类型”属性表示期望在数据库标签内找到的内容。

  <databases>

      <database id='human_resources' type='mysql'>
        <host>localhost</host>
        <user>usrhr</user>
        <pass>jobby</pass>
        <name>consol_hr</name>
      </database>

      <database id='products' type='my_bespoke'>
        <filename>/home/anthony/products.adb</filename>
      </database>

  </databases>
于 2014-04-01T15:47:36.143 回答
3

这完全取决于 XML 的用途。当它主要是软件和机器之间的互操作时——比如 Web 服务,如果只是为了保持一致性,那么使用所有元素会更容易(而且有些框架更喜欢这种方式,例如 WCF)。如果它是针对人类消费的——即主要由人们创建和/或阅读——那么明智地使用属性可以大大提高可读性;XHTML 就是一个合理的例子,XSLT 和 XML Schema 也是如此。

于 2009-07-08T08:33:27.043 回答
3

我通常在属性是元数据的基础上工作——即关于数据的数据。我要避免的一件事是将列表放入属性中。例如

attribute="1 2 3 7 20"

否则,您有额外的解析级别来提取每个元素。如果 XML 提供了列表的结构和工具,那为什么还要自己强加另一个。

您可能希望优先编码属性的一种情况是通过 SAX 解析器提高处理速度。使用 SAX 解析器,您将获得一个包含元素名称和属性列表的元素回调。如果您使用了多个元素,那么您将获得多个回调(每个元素一个)。当然,这有多大的负担/时间消耗有待讨论,但也许值得考虑。

于 2009-07-08T08:33:32.253 回答
1

作者的观点是正确的(除了属性可能包含值列表)。问题是你是否关心他的观点。

由你决定。

于 2009-07-08T08:29:50.123 回答
0

您可能会以语义方式看到问题。

如果数据与元素的联系更紧密,它将是一个属性。

即:元素的ID,我将其作为元素的属性。

但确实,在解析文档时,属性可能比元素更令人头疼。

一切都取决于您,以及您如何设计架构。

于 2009-07-08T08:35:23.170 回答
0

正是因为这种垃圾,你应该避免使用 w3schools。如果有的话,那甚至比他们关于 JavaScript 的骇人听闻的东西还要糟糕。

作为一般规则,我建议内容 - 即最终用户预计会使用的数据(无论是人类阅读,还是接收信息进行处理的机器) - 最好包含在元素中。元数据——例如与一段内容相关联的 ID,但仅对内部使用有价值,而不是用于向最终用户显示——应该在属性中。

于 2009-07-08T11:45:09.807 回答
0

在决定 XML 格式时要记住另一件事:如果我没记错的话,“id”属性的值不能全是数字,它们必须符合 XML 中的名称规则。当然,这些值必须是唯一的。我有一个项目必须处理不符合这些要求的文件(尽管它们在其他方面是干净的 XML),这使得处理文件更加复杂。

于 2009-07-09T02:04:35.953 回答